【发布时间】:2018-04-06 01:28:59
【问题描述】:
出于好奇,如果在 java8 样式中使用 Comparator,即使用 Lambda 表达式,是否比常规比较具有任何优势,即
按id排序的一种方法是:-
List sortedAcs = ac
.stream()
.sorted((a, b) -> Long.compare(a.getId(), b.getId())) //sorted by id here
.collect(Collectors.toList());
其他方法可能是 Java 8 方式:-
List sortedAcs = ac
.stream()
.sorted(Comparator.comparingLong(AC::getId)) //sorted by id here
.collect(Collectors.toList());
后一种方法 (java-8 method reference) 与前一种方法相比有什么性能优势吗?
请帮忙!!!
【问题讨论】:
-
任何差异都可以忽略不计。他们都做同样的事情。
-
在 'java.util.Comparator.comparingLong' 方法中,您可以看到与第一个示例 '(c1, c2) -> Long.compare(keyExtractor.applyAsLong(c1), keyExtractor. applyAsLong(c2))'
-
工程师喜欢测量事物。您能否尝试通过执行 100K 次来衡量性能?很高兴在答案部分看到您的发现。
-
单个比较之间的任何性能差异都无关紧要,最大的性能损失是由实际排序造成的。如果您试图根据性能选择一个而不是另一个,那么您并不真正了解性能调整(或排序)。
-
第二种变体的好处不是性能,而是简化。它更短,并且避免了代码重复。这不仅仅是一个理论点。即使在如此短的代码 sn-ps 中,我也看到过复制和粘贴错误,例如
(a, b) -> Long.compare(a.getId(), a.getId())您必须仔细查看才能发现错误。如果您希望这个特定的 sn-p 更快,请使用List<AC> sortedAcs=new ArrayList<>(ac); sortedAcs.sort(Comparator.comparingLong(AC::getId));就地排序。