public static <T> Comparator<T> comparingInt(ToIntFunction<? super T> keyExtractor) {
Objects.requireNonNull(keyExtractor);
// 这里return是个什么鬼,一脸懵逼
return (Comparator<T> & Serializable)
(c1, c2) -> Integer.compare(keyExtractor.applyAsInt(c1), keyExtractor.applyAsInt(c2));
}
代码示例:
interface SerializableComparator extends Comparator<Integer>, Serializable {}
@Test
public void test2() {
Comparator<Integer> comparator =
new SerializableComparator() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2;
}
};
System.out.println(comparator instanceof Comparator); // true
System.out.println(comparator instanceof Serializable); // true
/*lambda表达式写法*/
Comparator<Integer> comparator2 = (Comparator<Integer> & Serializable) (o1, o2) -> o1 - o2;
System.out.println(comparator2 instanceof Comparator); // true
System.out.println(comparator2 instanceof Serializable); // true
System.out.println(comparator2.getClass()); // class com.test.cn.Testclass1$$Lambda$1/1879492184
}
结论:
1.return (Comparator<T> & Serializable) (c1, c2) ->
Integer.compare(keyExtractor.applyAsInt(c1), keyExtractor.applyAsInt(c2))表示
lambda表达式生成的匿名类实例分别实现了Comparator接口和Serializable接口,并将该匿名类实例返回
2. lambda表达式本质是一个匿名类的实例
3. lambda表达式本质是一个函数式接口的实例