繁体   English   中英

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

[英]Java 8 Stream - .max() with duplicates

所以我有一组对象,它们的步长变量可以是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 comparator.compare(a, b) >= 0 ? a : b你可以看到当2个元素相等时,即compare返回0,则返回第一个元素。 因此,在您的案件将在收集第一返回MyClass最高目标step

更新:正如用户在评论中正确提到的8472 ,您不应该依赖javadocs未明确指定的实现。 但是你可以在max方法上编写单元测试,以了解它在标准java库中的逻辑是否已经改变。

由于文档未指定排序,因此在未来版本的JVM或JVM的不同实现中,顺序可能不同。

如果您关心哪一个被退回,那么我的建议是编写您自己的减少操作或收集器,以按照您的意愿行事。 这样未来的实现就无法改变它,你可以明确地说明会发生什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM