Return 来自使用 lambda 表达式的比较器的值 java

Return value from comparator using lambda expression java

我正在模拟 java 中的 haskell 函数 foldl。 同时检索并删除列表的第一个索引。
我已经做到了,使用以下签名 foldl(BiFunction <R, T, R> f, R z, List<T> l),其中 TStringRint.

现在唯一的问题是我需要创建一个 max java 方法,它使用模拟的 foldl 并具有以下签名:max(Comparator<T> c, List<T> l)

这是我用作示例的比较器:
Comparator.comparing(s -> Integer.valueOf(s.split(",")[1]));

我想我需要构建一个 lambda 表达式,所以它 returns 比较器的值,如果它是真的。

我所有的尝试都是徒劳的,因为我不知道如何在 lambda 表达式中使用比较器,而且我是这种表达式的新手。

如有任何帮助,我们将不胜感激。 提前致谢。

您可以通过

使用 Comparator 获得两个元素中的最大值
(t, u) -> c.compare(t, u) > 0 ? t : u

这表示:如果 t 大于 u,return t,否则 return u

此 lambda 表达式可以作为 BiFunction 在您的 foldl 方法中传递。这是一个完整的工作示例。我决定将列表的第一个元素作为 z 传递。这是有道理的,因为空列表无论如何都没有最大值。

public static void main(String[] args) {
    List<Integer> list = Arrays.asList(7, 2, 8, 1, 9, 5);
    System.out.println(max(Comparator.naturalOrder(), list));
}

// Not knowing Haskell at all, this is my guess at what foldl does.
private static <R, T> R foldl(BiFunction<R, T, R> f, R z, List<T> l) {
    for (T t : l)
        z = f.apply(z, t);
    return z;
}

private static <T> T max(Comparator<T> c, List<T> l) {
    if (l.isEmpty())
        throw new IllegalArgumentException();
    return foldl((t, u) -> c.compare(t, u) > 0 ? t : u, l.get(0), l);
}

在 java 8 中,引入了流。这种过程称为 java 的缩减,并且有标准方法可用于执行此类操作。