首页 > 解决方案 > lambdas只是java中的语法糖吗

问题描述

我来到这个代码

Collections.sort(list, (o1, o2) -> o1.getValue().compareTo(o2.getValue()));

我想知道,它只是一个语法糖吗?

Collections.sort(list, new Comparator<CodeTableEntry>() {
    @Override
    public int compare(CodeTableEntry o1, CodeTableEntry o2) {
        return o1.getValue().compareTo(o2.getValue());
    }
});

还是更聪明的东西?是否优化不每次都创建新实例?

这只是我的意见,但这种不平凡的单行代码并不像易于遵循简单的代码那样更好......(不是上面的那个,而是下面的那个)

static final Comparator<CodeTableEntry> codeTableEntryValueComparator = new Comparator<CodeTableEntry>() {
    @Override
    public int compare(CodeTableEntry o1, CodeTableEntry o2) {
        return o1.getValue().compareTo(o2.getValue());
    }
};

... 
    Collections.sort(list, codeTableEntryValueComparator);
...

澄清“是否优化不每次都创建新实例?”

因为只有一个new,我相信它很清楚,似乎不是。我做了这段代码来检查:

public class ComparatorTest {

    private static void sort(List<String> list) {
        Collections.sort(list, new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                System.out.println("comparator: " + this);
                return s1.compareTo(s2);
            }
        });
        System.out.println("sorted: " + list);
    }

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();

        list.add("c");
        sort(list);
        list.add("b");
        sort(list);
        list.add("a");
        sort(list);
    }

}

输出是

sorted: [c]
comparator: ComparatorTest$1@7852e922
sorted: [b, c]
comparator: ComparatorTest$1@4e25154f
comparator: ComparatorTest$1@4e25154f
comparator: ComparatorTest$1@4e25154f
comparator: ComparatorTest$1@4e25154f
sorted: [a, b, c]

我相信这表明,为每个方法调用创建了 Comparator 的新实例(因为不同的哈希码)


如何检查 lambdas,只是为了我的测试我在创建异常时打印了堆栈跟踪

Collections.sort(list, (o1, o2) -> getValue(o1).compareTo(o2));

getValue在哪里

public static String getValue(String s) {
    RuntimeException re = new RuntimeException();
    re.printStackTrace(System.out);
    return s;
}

它打印了

sorted: [c]
java.lang.RuntimeException
    at ComparatorTest.getValue(ComparatorTest.java:20)
    at ComparatorTest.lambda$0(ComparatorTest.java:15)
    at java.util.TimSort.countRunAndMakeAscending(Unknown Source)
    at java.util.TimSort.sort(Unknown Source)
    at java.util.Arrays.sort(Unknown Source)
    at java.util.ArrayList.sort(Unknown Source)
    at java.util.Collections.sort(Unknown Source)
    at ComparatorTest.sort(ComparatorTest.java:15)
    at ComparatorTest.main(ComparatorTest.java:32)
sorted: [b, c]
java.lang.RuntimeException
    at ComparatorTest.getValue(ComparatorTest.java:20)
    at ComparatorTest.lambda$0(ComparatorTest.java:15)
    at java.util.TimSort.countRunAndMakeAscending(Unknown Source)
    at java.util.TimSort.sort(Unknown Source)
    at java.util.Arrays.sort(Unknown Source)
    at java.util.ArrayList.sort(Unknown Source)
    at java.util.Collections.sort(Unknown Source)
    at ComparatorTest.sort(ComparatorTest.java:15)
    at ComparatorTest.main(ComparatorTest.java:34)
java.lang.RuntimeException
    at ComparatorTest.getValue(ComparatorTest.java:20)
    at ComparatorTest.lambda$0(ComparatorTest.java:15)
    at java.util.TimSort.countRunAndMakeAscending(Unknown Source)
    at java.util.TimSort.sort(Unknown Source)
    at java.util.Arrays.sort(Unknown Source)
    at java.util.ArrayList.sort(Unknown Source)
    at java.util.Collections.sort(Unknown Source)
    at ComparatorTest.sort(ComparatorTest.java:15)
    at ComparatorTest.main(ComparatorTest.java:34)
java.lang.RuntimeException
    at ComparatorTest.getValue(ComparatorTest.java:20)
    at ComparatorTest.lambda$0(ComparatorTest.java:15)
    at java.util.TimSort.binarySort(Unknown Source)
    at java.util.TimSort.sort(Unknown Source)
    at java.util.Arrays.sort(Unknown Source)
    at java.util.ArrayList.sort(Unknown Source)
    at java.util.Collections.sort(Unknown Source)
    at ComparatorTest.sort(ComparatorTest.java:15)
    at ComparatorTest.main(ComparatorTest.java:34)
java.lang.RuntimeException
    at ComparatorTest.getValue(ComparatorTest.java:20)
    at ComparatorTest.lambda$0(ComparatorTest.java:15)
    at java.util.TimSort.binarySort(Unknown Source)
    at java.util.TimSort.sort(Unknown Source)
    at java.util.Arrays.sort(Unknown Source)
    at java.util.ArrayList.sort(Unknown Source)
    at java.util.Collections.sort(Unknown Source)
    at ComparatorTest.sort(ComparatorTest.java:15)
    at ComparatorTest.main(ComparatorTest.java:34)
sorted: [a, b, c]

而且似乎只有一个ComparatorTest.lambda$0...

标签: javalambda

解决方案


推荐阅读