Java 中,方法引用(Method Reference) 是 Java 8 引入的一种简洁的语法形式,用于通过方法的名字来引用方法。它是 Lambda 表达式 的一种简化写法,特别适用于需要传递方法作为参数的场景。


方法引用的分类

方法引用主要有以下四种形式:

类型 语法 示例 说明
静态方法引用 ClassName::staticMethod Math::abs 引用类中的静态方法
实例方法引用(特定对象) instance::method System.out::println 引用对象的实例方法
实例方法引用(任意对象) ClassName::method String::toUpperCase 引用某个类的任意对象的实例方法
构造器引用 ClassName::new ArrayList::new 引用类的构造方法

1. 静态方法引用

静态方法引用用于引用类的静态方法。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
import java.util.Arrays;
import java.util.List;

public class StaticMethodReferenceExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(-3, -2, -1, 0, 1, 2, 3);

// 使用静态方法引用 Math::abs
numbers.stream()
.map(Math::abs)
.forEach(System.out::println);
}
}
  • 解释Math::abs 是静态方法引用,等价于 x -> Math.abs(x)

2. 实例方法引用(特定对象)

实例方法引用用于引用特定对象的实例方法。

示例

1
2
3
4
5
6
7
8
9
10
11
import java.util.Arrays;
import java.util.List;

public class InstanceMethodReferenceExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");

// 使用实例方法引用
names.forEach(System.out::println);
}
}
  • 解释System.out::println 是方法引用,等价于 x -> System.out.println(x)

3. 实例方法引用(任意对象)

当实例方法的调用目标是流中的每一个对象时,可以使用类名加方法名的形式引用实例方法。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
import java.util.Arrays;
import java.util.List;

public class InstanceMethodReferenceExample {
public static void main(String[] args) {
List<String> words = Arrays.asList("apple", "banana", "cherry");

// 使用实例方法引用
words.stream()
.map(String::toUpperCase)
.forEach(System.out::println);
}
}
  • 解释String::toUpperCase 是方法引用,等价于 s -> s.toUpperCase()

4. 构造器引用

构造器引用用于创建对象。它通过 ClassName::new 的形式引用类的构造方法。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class ConstructorReferenceExample {
public static void main(String[] args) {
List<String> names = List.of("Alice", "Bob", "Charlie");

// 使用构造器引用
List<String> nameList = names.stream()
.collect(Collectors.toCollection(ArrayList::new));

System.out.println(nameList);
}
}
  • 解释ArrayList::new 是构造器引用,等价于 () -> new ArrayList<>()

总结

方法引用类型 语法形式 等价Lambda表达式 示例
静态方法引用 ClassName::staticMethod (x) -> ClassName.staticMethod(x) Math::abs
实例方法引用(特定对象) instance::method (x) -> instance.method(x) System.out::println
实例方法引用(任意对象) ClassName::method (x) -> x.method() String::toUpperCase
构造器引用 ClassName::new () -> new ClassName() ArrayList::new