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)
,其中 T
是 String
,R
是 int
.
现在唯一的问题是我需要创建一个 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 的缩减,并且有标准方法可用于执行此类操作。
我正在模拟 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 表达式,所以它 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 的缩减,并且有标准方法可用于执行此类操作。