【问题标题】:The best way to sort list by item name length按项目名称长度对列表进行排序的最佳方法
【发布时间】:2017-07-13 08:41:23
【问题描述】:

从速度和舒适度的角度来看,哪种方式最好?

names.sort( (a,b) -> a.getName().length() - b.getName().length() );


Collections.sort(names, Comparator.comparing( s -> Celebrity.getName().length() ))


BiFunction<Celebrity,Celebrity,Integer> bifunc = (a,b) -> Integer.compare(a.getName().length(), b.getName().length());
Collections.sort( names, bifunc::apply );

【问题讨论】:

  • 请添加语言标签。
  • 你为什么不衡量你的方法?
  • 从正确开始(一个坏的解决方案没有多大价值)。然后优化可读性。一旦你确定了这两个并且可以证明系统的这个特定部分的性能是一个整体瓶颈,就可以分析和优化性能(也是谷歌“阿姆达尔定律”)。
  • @Flown 因为那么我应该有一个大数据集来获得正确的结果。这对我来说只是花絮。
  • 使用Comparator.comparingInt( s -&gt; s.getName().length() ),注意comparingInt 而不是comparing 避免代码重复装箱。虽然避免代码重复对性能没有影响,但它提高了代码质量并有助于避免错误,这一点更为重要。虽然 JIT 可以避免在第三个示例中不必要的 BiFunction 绕道和装箱的开销,但最好还是不要一开始就拥有它,特别是因为它在源代码方面也是令人费解的,并且还包含代码重复第一个变种

标签: java performance list java-8


【解决方案1】:

都是一样的。看Collections.sort方法:

public static <T> void sort(List<T> list, Comparator<? super T> c) {
   list.sort(c);
}

所有 3 种方法都按相同的算法排序。

您应该编写尽可能可读的代码。除非确实需要,否则不要进行过早的微优化。

我会使用这一行:

names.sort(Comparator.comparingInt(celebrity -&gt; celebrity.getName().length()));

【讨论】:

    猜你喜欢
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    • 1970-01-01
    • 2017-08-11
    • 1970-01-01
    • 2017-02-02
    • 2012-08-18
    相关资源
    最近更新 更多