从匿名类到lambda
Collections.sort(words, new Comparator<String>() {
public int compare(String s1, String s2) {
return Integer.compare(s1.length(), s2.length())
}
})
Collections.sort(words, (s1, s2) -> Integer.compare(s1.length(), s2.length()))
省略类型
lambda表达式的参数s1,s2和返回值的类型,都被略去,编译器通过类型推导
从上下文中推断被略去的类型。
类型推导很复杂,复杂到足以写整个一章节。在使用lambda的时候,只需要记住:
略去所有的类型,除非某个类型能够让程序更加清晰(直到编译器提示你的时候,再标明类型)
还可以更加精简:
comparingInt是Comparator的一个static方法,接受一个ToIntFunction类型的参数,返回Comparator对象
Collections.sort(words, comparingInt(Integer::length))
优于List接口在1.8后增加了sort方法,支持直接传入Comparator对象
words.sort(comparingInt(Integer::length))
(这里有一个点没有理解,周末补上)
labmda表达式不能够替代匿名类的地方:
- new一个抽象类的对象实例, 例如:
// 我自己的例子
new TypeToken<Map<String, Integer>>() {}
- lambda不可以实例化拥有多个抽象方法的接口,(因为只能实例化函数式接口,而函数式接口的充分的一个必要条件就是:接口只能有一个抽词能够方法)
- lambda表达式中没有指向自己的引用。(表达式中的this为包含这个lambda的实例)
网友评论