Comparator接口的静态方法如下
lambda表达式:(c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2))
(Comparator<T> & Serializable)作为lambda表达式实现的接口,也可以这样理解:
lambda表达式相当于构造了一个匿名内部类的对象,而这个匿名内部类实现了Comparator<T>以及Serializable接口。
此时会感到疑问,实现了接口不是也需要实现它们的抽象方法吗。没错,Comparator接口是一个函数式接口,它只有一个抽象方法、一些静态方法以及一些默认方法,而接口的静态方法是不需要我们实现的,接口的默认方法我们可以选择不去实现。而Serializable接口中没有任何方法。
为了印证我们的猜想我编写了一段代码:
@SpringBootTest public class MyTest { public static void main(String[] args) { D d = (D & C) (one, two) -> one + two; Class<? extends D> aClass = d.getClass();//获取匿名内部类的class System.out.println(aClass.getName());//获取这个匿名内部类的名字 System.out.println(C.class.isAssignableFrom(aClass));//判断这个匿名内部类是否实现了接口C System.out.println(D.class.isAssignableFrom(aClass));//判断这个匿名内部类是否实现了接口D } } interface C { } @FunctionalInterface interface D { String hello(String one, String two); default String hh() { return ""; } }
测试结果如下 ,的确实现了这两个接口
com.jx.ldw.MyTest$$Lambda$1/1910163204
true
true