流与收藏

时间:2018-07-27 15:57:24

标签: java collections java-8 java-stream

我有一个球员名单,并希望获得最低评分的球员。我可以做到:

Player player1 = Collections.min(players,Comparator.comparing(Player::getRating));

或者我可以做:

Player player2 = players.stream().min(Comparator.comparing(Player::getRating)).get();

在性能或其他方面,哪个更好?

3 个答案:

答案 0 :(得分:3)

应该没什么大不同。
我们可以争辩说,流方式可以利用并行流选项,而Collections.min()不能。
而且在您提出的两种情况下,拳击的成本都可能很高。因此,您应该偏爱comparingInt()的{​​{1}} / comparingDouble() / comparingLong()

答案 1 :(得分:3)

考虑到您的问题是:“在性能上还是在其他方面哪个更好?” @davidxxx和@Eugene已经阐述了一些有趣的观点,这是另一个观点:

支持流变体的另一个原因是,对min的调用返回了一个Optional<T>,其本身具有足够的描述性,还使用户能够决定在“无值”情况下该做什么。如果集合为空,Collections.min只会抛出一个异常,这也可能是用户想要的,但这是需要考虑的事情。我个人偏爱使用流版本,因为它在“无价值”情况下为您提供了更多选择。

这就是说,如果您仅仅因为总是有一个 值或一个异常有意义就不需要这些附加选项,那么我将采用第一种方法。

最终,您决定继续使用哪种选项不取决于性能,因为它们之间并没有太大的区别,除非您认为可以利用并行流API。

在这种情况下,我建议您考虑我上面提到的内容,并为您和/或您的同事选择一种更具可读性/更舒适的方法。

答案 2 :(得分:2)

好吧,如果传入的源已经被排序,则Stream实现可能会从该源返回第一个(或最后一个)条目,而不必遍历整个Collection,而不像{{ 1}}。对于您的示例来说,似乎做起来太复杂了,但是对于一个简单的事情,可能会更容易。

此操作目前尚未完成,但是可以在将来实现,因为我可能会赞成Collections.min