Item 42: Prefer lambdas to anonymous classes (lambda表达式优于匿名类)

从匿名类到lambda

Collections.sort(words, new Comparator() {
    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表达式不能够替代匿名类的地方:

  1. new一个抽象类的对象实例, 例如:
// 我自己的例子
new TypeToken>() {}
  1. lambda不可以实例化拥有多个抽象方法的接口,(因为只能实例化函数式接口,而函数式接口的充分的一个必要条件就是:接口只能有一个抽词能够方法)
  2. lambda表达式中没有指向自己的引用。(表达式中的this为包含这个lambda的实例)

你可能感兴趣的:(Item 42: Prefer lambdas to anonymous classes (lambda表达式优于匿名类))