java - 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
...
解决方案
推荐阅读
- laravel - 重用控制器功能的最佳实践
- android - 如何解决不支持的渲染问题 Path.op()?
- node.js - 当浏览器可以请求 API 时,Axios 因错误不清楚而失败
- json - 自动完成 Jquery UI 不适用于 JSON
- microsoft-graph-api - Microsoft Graph 返回的用户电子邮件是否经过验证?
- java - JEE 7调度程序如何在不阻塞调度程序的情况下分叉任务
- javascript - 替换大img onclick 其他img JS
- highcharts - Highcharts 甘特图避免重叠任务
- react-navigation - 在 v5 中有条件地渲染 Navigator
- swift - Catalyst - 以编程方式打开上下文菜单