Java 8 Stream – .max()与重复

所以我有一个可以为1 – 4的步长变量的对象集合.

public class MyClass {
    private Long step;

    //other variables, getters, setters, etc.
}

收集和LT; MyClass的> myOjbects = / * get collection * /;

然后,我想从具有最大步长值的集合中获取一个MyClass实例,所以我做:

final Optional<MyClass> objectWithMaxStep =
   myObjects.stream().max(Comparator.comparing(MyClass::getStep));

但是,有些情况下,集合中将有多个MyClass实例的步长等于4.

所以,我的问题是,它如何确定在可选中返回哪个实例,或者当流中的多个对象具有正在比较的最大值时它是否引发异常?

max()函数的Java 8文档不会指定在这种情况下会发生什么.

max实现减少使用maxBy的集合:

 public static <T> BinaryOperator<T> maxBy(Comparator<? super T> comparator) {
        Objects.requireNonNull(comparator);
        return (a, b) -> comparator.compare(a, b) >= 0 ? a : b;
    }

这里compare.compare(a,b)> = 0? a:b您可以看到当2个元素相等时,即compare返回0,则返回第一个元素.所以在你的情况下,首先会返回MyClass对象的最高级别.

更新:由于用户the8472在注释中正确提及,您不应该依赖javadocs未明确指定的实现.但是您可以在max方法上编写单元测试,以了解标准java库中的逻辑是否已更改.

翻译自:https://stackoverflow.com/questions/31790372/java-8-stream-max-with-duplicates

转载注明原文:Java 8 Stream – .max()与重复