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);

是的,Predicates 可以被 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 放在那里。 我已经在上面使用它作为获得最大值的选项。