所以我有一组对象,它们的步长变量可以是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文档未指定在这种情况下会发生什么。
答案 0 :(得分:16)
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
对象中返回 first 。
更新:正如用户the8472在评论中正确提到的那样,您不应该依赖javadocs未明确指定的实现。但您可以在max
方法上编写单元测试,以了解标准java库中的逻辑是否已更改。
答案 1 :(得分:10)
由于文档未指定排序,因此在未来版本的JVM或JVM的不同实现中,顺序可能不同。
如果您关心哪一个被退回,那么我的建议是编写您自己的减少操作或收集器,以按照您的意愿行事。这样未来的实现就无法改变它,你可以明确地说明会发生什么。