Java 8 Stream-具有重复项的.max()

因此,我有一组对象,这些对象的阶跃变量可以为1-4。

public class MyClass {

private Long step;

//other variables, getters, setters, etc.

}

Collection<MyClass> myOjbects = /*get collection*/;

然后,我想MyClass从具有最大步进值的集合中获取一个实例,因此我这样做:

final Optional<MyClass> objectWithMaxStep =

myObjects.stream().max(Comparator.comparing(MyClass::getStep));

但是,在某些情况MyClass下,集合中将存在多个实例,这些实例的步骤等于4。

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

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;

}

在这里comparator.compare(a, b) >= 0 ? a :

b您可以看到,当2个元素相等时,即compare返回0,则返回第一个元素。因此,根据您的情况,将 首先

MyClass具有最高的集合对象中返回step

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

以上是 Java 8 Stream-具有重复项的.max() 的全部内容, 来源链接: utcz.com/qa/434196.html

回到顶部