05 方法引用

方法引用(Method Reference)是 Java 8 引入的一种语法糖,用于简化 Lambda 表达式的写法。它提供了一种更简洁的方式来引用已有的方法作为函数式接口的实现。

方法引用可以看作是 Lambda 表达式的一种特殊形式,如果方法体中只有一个方法的调用的话,它可以直接引用已有的方法,而不需要编写完整的 Lambda 表达式,进而进一步简化编码。

基本格式如下:

类名或者对象名::方法名

方法引用的使用取决于函数式接口的抽象方法的参数和返回类型。以下是方法引用的几种形式:

  • 静态方法引用:ClassName::staticMethodName,例如 Integer::parseInt。
  • 实例方法引用:instance::instanceMethodName,例如 String::length。
  • 对象方法引用:ClassName::instanceMethodName,例如 System.out::println。
  • 构造方法引用:ClassName::new,例如 ArrayList::new。

静态方法引用

如果在重写方法的时候,方法体中只有一行代码,并且这行代码是 调用了某个类的静态方法,并且我们把要重写的抽象方法中所有的参数都 按照顺序 传入了这个静态方法中,这时候就可以通过方法引用的方式调用该静态方法。

例如,如下代码就可以用方法引用优化

public static void main(String[] args) {
    List<Author> authors = getAuthors();
    authors.stream()
            .map(author -> author.getName())
            .map(name -> String.valueOf(name))
            .forEach(name -> System.out.println(name));
}

注意,如果我们所重写的方法是没有参数的,调用的方法也是没有参数的也相当于符合以上规则。

public static void main(String[] args) {
    List<Author> authors = getAuthors();
    authors.stream()
            .map(author -> author.getName())  // 也可以使用方法引用,但是这里主要是介绍静态方法引用
            .map(String::valueOf)
            .forEach(System.out::println);
}

实例方法引用

如果在重写方法的时候,方法体中 只有一行代码,并且这行代码是 调用了某个对象的成员方法,并且把要重写的抽象方法中所有的参数都按照顺序传入了这个成员方法中,这个时候就可以引用对象的实例方法。

比如上面的代码可以进一步简化:

public static void main(String[] args) {
    List<Author> authors = getAuthors();
    authors.stream()
            .map(Author::getName)
            .map(String::valueOf)
            .forEach(System.out::println);
}