sorting - thenComparing 与 thenComparingInt 的性能 - 使用哪个?

标签 sorting java-8 comparator

我有一个问题,如果我正在比较整数,调用 thenComparingInt(My::intMethod) 与 thenComparing(My::intMethod) 是否存在性能差异,换句话说,如果我正在比较不同的类型,引用和原始,例如String, int, 等等。我的一部分只想说 comparing().thenComparing().thenComparing() 等等,但是如果第三次调用比较的是 int 或 Integer 值,我应该做 comparing.thenComparing().thenComparingInt() ?

我假设 comparing() 和 thenComparing() 使用 compareTo 方法在幕后比较任何给定类型,或者可能对于整数,Integer.compare?我还假设我原来的问题的答案可能涉及性能,因为 thenComparingInt 会知道正在传入一个 int,而 thenComparing 必须将 int 自动装箱为 Integer,然后可能会转换为 Object?

此外,我想到的另一个问题 - 是否有一种链接方法引用的方法,例如Song::getArtist::length 其中 getArtist 返回一个字符串?原因是我想做这样的事情:

songlist.sort(
            Comparator.comparing((Song s) -> s.getArtist().length()));


    songlist.sort(
            Comparator.comparing(Song::getArtist, 
                    Comparator.comparingInt(String::length)));


    songlist.sort(
            Comparator.comparing(Song::getArtist, String::length));

在这 3 个示例中,前两个编译但底部似乎在 Eclipse 中抛出编译错误,我本以为 String::length 的第二个参数有效?但也许不是因为它期望比较器不是函数?

最佳答案

问题一

我认为 thenComparingInt(My::intMethod) 可能更好,因为它应该避免装箱,但您必须尝试这两个版本,看看它是否真的有所作为。

问题2

songlist.sort(
        Comparator.comparing(Song::getArtist, String::length));

无效,因为第二个参数应该是 Comparator 而不是返回 int 的方法。

关于sorting - thenComparing 与 thenComparingInt 的性能 - 使用哪个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24452218/

相关文章:

java - 如何编写比较器的 equals()

android - 在 Android 中按字母顺序对文件列表、文件夹和文件进行排序

java - 将防御副本转换为流仍然是线程安全的吗?

带有函数链接表达式的 Java8 可选

java - 如何使用Contains或matches返回true?

java - 集合中的对象具有不同相等(物理相等和逻辑相等)的机制

c# - 调用归并排序 C#

postgresql - 对分区和分区内的行进行排序

gwt - GET 中的程序化 CellTable 排序不起作用

java - JAVA 8流的现有条件