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