Java 8 个谓词到 select 最大值
Java 8 predicate to select the max
这是一个由两部分组成的问题。我只是在学习 Java 8 中的谓词,我需要知道是否有一个谓词可以传递给 filter()
方法以 select 整数列表中的最大值,如下:
List<Integer> numbers = ...
Integer max = numbers.stream()
.filter(n -> ???)
.getFirst()
.get();
更大的问题是:谓词是否可以在数学上链接起来,这样就不必链接 filter()
或 reduce()
方法,这样在一个谓词中完成的工作就可以反映在 or传递给下一个,所以不要写:
list.stream()
.filter(/* predicate1 */
item -> {
// do some work and save in some local variable "var"
})
.filter(/* predicate2 */ var -> ...)
.reduce(predicate3)
.getFirst()
.get();
我可以写:
list.stream()
.filter(predicate1 "andThen" predicate2 "andThen" reduce by predicate3)
.getFirst()
.get();
我推测可能有一种使用 andThen()
功能或编写自定义谓词的方法。谁能帮助我更好地理解这一点?
不,你不能使用filter(Predicate)
到select一个Stream
的最大值。
您还有多个其他选择:
stream.max(Comparator.naturalOrder());
stream.sorted(Comparator.reverseOrder()).findFirst();
stream.mapToInt(i -> i).max();
stream.reduce(Integer::max);
是的,Predicate
s 可以被 and(Predicate)
链接起来。实现基本上是这样的:
Predicate<T> and(Predicate<? super T> other) {
return t -> test(t) && other.test(t);
}
您也可以自己编写:
static <T> Predicate<T> and(Predicate<? super T>... ps) {
return t -> Stream.of(ps).allMatch(p -> p.test(t));
}
用法:
stream.filter(and(i -> i > 11, i -> i < 50))
您可以应用多个过滤器,因此您通常会链接调用:
stream.filter(i -> i > 11).filter(i -> i < 50)
你明白reduce(BinaryOperator)
是做什么的吗?你不能把 Predicate
放在那里。
我已经在上面使用它作为获得最大值的选项。
这是一个由两部分组成的问题。我只是在学习 Java 8 中的谓词,我需要知道是否有一个谓词可以传递给 filter()
方法以 select 整数列表中的最大值,如下:
List<Integer> numbers = ...
Integer max = numbers.stream()
.filter(n -> ???)
.getFirst()
.get();
更大的问题是:谓词是否可以在数学上链接起来,这样就不必链接 filter()
或 reduce()
方法,这样在一个谓词中完成的工作就可以反映在 or传递给下一个,所以不要写:
list.stream()
.filter(/* predicate1 */
item -> {
// do some work and save in some local variable "var"
})
.filter(/* predicate2 */ var -> ...)
.reduce(predicate3)
.getFirst()
.get();
我可以写:
list.stream()
.filter(predicate1 "andThen" predicate2 "andThen" reduce by predicate3)
.getFirst()
.get();
我推测可能有一种使用 andThen()
功能或编写自定义谓词的方法。谁能帮助我更好地理解这一点?
不,你不能使用filter(Predicate)
到select一个Stream
的最大值。
您还有多个其他选择:
stream.max(Comparator.naturalOrder());
stream.sorted(Comparator.reverseOrder()).findFirst();
stream.mapToInt(i -> i).max();
stream.reduce(Integer::max);
是的,Predicate
s 可以被 and(Predicate)
链接起来。实现基本上是这样的:
Predicate<T> and(Predicate<? super T> other) {
return t -> test(t) && other.test(t);
}
您也可以自己编写:
static <T> Predicate<T> and(Predicate<? super T>... ps) {
return t -> Stream.of(ps).allMatch(p -> p.test(t));
}
用法:
stream.filter(and(i -> i > 11, i -> i < 50))
您可以应用多个过滤器,因此您通常会链接调用:
stream.filter(i -> i > 11).filter(i -> i < 50)
你明白reduce(BinaryOperator)
是做什么的吗?你不能把 Predicate
放在那里。
我已经在上面使用它作为获得最大值的选项。