我有一个球员名单,并希望获得最低评分的球员。我可以做到:
Player player1 = Collections.min(players,Comparator.comparing(Player::getRating));
或者我可以做:
Player player2 = players.stream().min(Comparator.comparing(Player::getRating)).get();
在性能或其他方面,哪个更好?
答案 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
。