13.2 函数式接口
上一节的例子留下了许多的疑惑,先来回顾一下:
class LengthComparator implements Comparator{
public int compare(String first,String second){
return first.length()-second.length();
}
}
list.sort(new LengthComparator());
直接简化成这样:
list.sort((first,second)->{
return first.length()-second.length();
});
这里会出现很多疑惑:
1.首先就是lambda表达式里的first、second,它们是指什么?
这两个是参数,但这里并没有写出它们的类型,它们很明显是方法compare的参数,这里似乎跳过了接口直达方法。
2.如何匹配到Comparator接口里的compare方法?
就算上面的表达式是compare,这是如何匹配到的?毕竟表达式里既没有写Comparator,也没有compare。这个机制是怎么找到这个compare方法的?
这将提到一个概念:函数式接口。函数式接口就是只有一个抽象方法的接口。
以上谜团就揭开了,lambda表达式接受的实际上是一个函数式接口,表达式实现的“方法”实际上就是函数式接口唯一的那个方法,于是很多写法都可以忽略了,包括函数名、参数类型。(first,second)->这样的写法,对应的就是唯一的方法compare(String first,String second),由于只有一个方法,参数连类型也可以省略了。