gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 18:09:55 25 4
gpt4 key购买 nike

我正在模拟 haskell 函数 foldl在Java中。同时检索并删除列表的第一个索引。
我已经这样做了,签名如下 foldl(BiFunction <R, T, R> f, R z, List<T> l) ,其中TStringR一个int .

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

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

我想我需要构造一个 lambda 表达式,以便它返回比较器的值(如果它为 true)。

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

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

最佳答案

您可以使用 Comparator 获取两个元素的最大值

(t, u) -> c.compare(t, u) > 0 ? t : u

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

此 lambda 表达式可以作为 foldl 方法中的 BiFunction 传递。这是一个完整的、有效的示例。我决定将列表的第一个元素作为 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 中称为归约,并且有标准方法可用于执行此类操作。

关于java - 使用 lambda 表达式 java 从比较器返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33814472/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com