Skip to content

方法引用

方法引用是 Java 8 引入的一个语法糖,它允许你直接引用已有方法或构造函数,而无需编写冗余的 Lambda 表达式。

基本语法

如果 Lambda 表达式的内容仅仅是调用一个已存在的方法,那么就可以用方法引用来替换。使用方法引用最直观的感受就是不用再去写冗余的形参了。

java
类名或对象::方法名

当函数式接口的抽象方法参数 & 返回值和某个类的方法参数&返回值相同,我们就可以使用方法引用

方法引用不是在“执行”方法,而是在**“描述”一个逻辑传递**。它本质上是把参数的传递交给了底层的函数式接口去自动处理。

静态方法引用

  • Lambda表达式:
java
Function<String, Integer> f = (s) -> Integer.parseInt(s);
  • 方法引用:
java
Function<String, Integer> f = Integer::parseInt;

对象实例方法引用

引用一个已经存在的外部对象的方法。

  • Lambda表达式:
java
list.forEach(item -> System.out.println(item));
  • 方法引用:
java
list.forEach(System.out::println);

特定类型的实例方法引用

这种形式比较特殊:Lambda 的第一个参数变成方法的调用者,其余参数变成方法的参数。从视觉上看会觉得是在调用类的静态方法

示例1:判断相等

  • Lambda表达式:
java
BiPredicate<String, String> bp = (x, y) -> x.equals(y);
  • 方法引用:
java
BiPredicate<String, String> bp = String::equals;

示例2:小写转大写

  • Lambda表达式:
java
List<String> list = Arrays.asList("apple", "vue", "java");

// Lambda 形式:显式接收参数 s,并调用 s.toUpperCase()
list.stream()
    .map(s -> s.toUpperCase())
    .forEach(System.out::println);
  • 方法引用
java
// 方法引用形式:类名::实例方法名
list.stream()
    .map(String::toUpperCase) 
    .forEach(System.out::println);

构造方法引用

用于创建对象。具体调用哪个构造器,取决于函数式接口的形参定义

  • Lambda表达式:
java
Function<String, User> function = (s) -> new User(s);
  • 等价于:
java
Function<String, User> function = User::new;