stream.max(Comparator)和stream.collect(Java中的Collectors.maxBy(Comparator)之间的区别

Jay*_* Ni 3 api java-8 java-stream collectors

在Java Streams中 - 性能之间stream.max(Comparator)和之间的区别是什么stream.collect(Collectors.maxBy(Comparator)).两者都将根据传递的比较器获取最大值.如果是这种情况,为什么我们需要使用收集方法收集额外步骤?我们什么时候应该选择前者和后者?适合使用两者的用例场景是什么?

And*_*ner 7

Effective Java 3rd Edition, page 214 中有相关引述:

counting方法返回的收集器仅用作下游收集器。相同的功能可Stream通过count方法直接在 上使用,因此永远没有理由说collect(counting())Collectors这个属性还有十五个。

鉴于maxBy由 复制Stream.max,它大概是这十六种方法之一。

不久之后,在同一页上,它继续证明双重存在是合理的:

从设计的角度来看,这些收集器代表了在收集器中部分复制流功能的尝试,以便下游收集器可以充当“迷你流”。

就我个人而言,我觉得这个法令和解释有点不令人满意:它说这16个收藏家不是故意这样使用的,但不是为什么他们不应该这样做

我认为直接在流上的方法能够以比一般收集器更有效的专门方式实现。


JB *_*zet 5

他们做同样的事情,并共享相同的代码.

为什么我们需要使用收集方法收集额外的步骤?

你没有.使用,max()如果这是你想要做的.但有些情况下收集器可以派上用场.例如:

Optional<Foo> result = stream.collect(createCollector());
Run Code Online (Sandbox Code Playgroud)

哪里createCollector()会根据某些条件返回一个收集器,可能是maxBy,minBy或其他东西.

一般而言,您不应过多关注两个执行相同操作的方法之间可能存在的小的性能差异,并且很有可能以相同的方式实现.相反,您应该使代码尽可能清晰可读.