使用lambda表达式java从比较器返回值

时间:2015-11-19 21:13:14

标签: java haskell lambda comparator

我在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表达式,因此如果它是真的,它将返回比较器的值。

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

任何帮助将不胜感激。 提前谢谢。

1 个答案:

答案 0 :(得分:4)

您可以通过

使用Comparator获取最多两个元素
(t, u) -> c.compare(t, u) > 0 ? t : u

这表示:如果t大于u,则返回t,否则返回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中的减少,并且有一些标准方法可用于执行此类操作。