我在java中模拟haskell函数foldl
。
同时检索并删除列表的第一个索引。
我已完成此操作,使用以下签名foldl(BiFunction <R, T, R> f, R z, List<T> l)
,其中T
为String
,R
为int
。
现在唯一的问题是我需要创建一个max
java方法,该方法使用模拟的foldl
并具有以下签名:max(Comparator<T> c, List<T> l)
。
这是我用的比较器作为例子:
Comparator.comparing(s -> Integer.valueOf(s.split(",")[1]));
我想我需要构造一个lambda表达式,因此如果它是真的,它将返回比较器的值。
我所有的尝试都是徒劳的,因为我不知道如何在lambda表达式中使用比较器,而且我是这种表达式的新手。
任何帮助将不胜感激。 提前谢谢。
答案 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中的减少,并且有一些标准方法可用于执行此类操作。