159. Java Lambda 表达式 - 方法引用的四种类型
方法引用是 Java 8 引入的一种简洁语法,用于使用已有方法代替 Lambda 表达式。它能让代码更清晰、紧凑。方法引用有四种类型,每种适用于不同场景。
1. 静态方法引用(Static Method Reference)
✅ 语法:
ClassName::staticMethod
✅ 等价 Lambda:
(args) -> ClassName.staticMethod(args)
✅ 场景说明:
引用类的静态方法。当 Lambda 中只是调用一个静态方法时,可以使用此写法简化代码。
✅ 示例:
class MathUtils {
public static int add(int a, int b) {
return a + b;
}
}
BiFunction<Integer, Integer, Integer> adder = MathUtils::add;
System.out.println(adder.apply(5, 3)); // 输出 8
2. 未绑定方法引用(Unbound Instance Method Reference)
✅ 语法:
ClassName::instanceMethod
✅ 等价 Lambda:
(obj, args) -> obj.instanceMethod(args)
✅ 场景说明:
引用实例方法,但没有绑定具体对象。调用对象通过方法参数传入,常用于流操作中。
✅ 示例:
Function<String, String> upper = String::toUpperCase;
System.out.println(upper.apply("hello")); // 输出 "HELLO"
等价于:
s -> s.toUpperCase()
3. 绑定方法引用(Bound Instance Method Reference)
✅ 语法:
instance::instanceMethod
✅ 等价 Lambda:
(args) -> instance.instanceMethod(args)
✅ 场景说明:
方法调用对象是已知的具体实例,即方法引用时对象已经确定,无需再传入。
✅ 示例:
Person john = new Person("John");
Supplier<String> getName = john::getName;
System.out.println(getName.get()); // 输出 "John"
等价于:
() -> john.getName()
4. 构造函数引用(Constructor Reference)
✅ 语法:
ClassName::new
✅ 等价 Lambda:
(args) -> new ClassName(args)
✅ 场景说明:
引用构造函数创建新对象,常用于 Supplier、Function、BiFunction 等函数式接口中。
✅ 示例:
Function<String, Person> personCreator = Person::new;
Person p = personCreator.apply("Alice");
System.out.println(p.getName()); // 输出 "Alice"
✅ Person 类定义示例
class Person {
private String name;
public Person(String name) { this.name = name; }
public String getName() { return name; }
}
✅ 总结表格
| 方法引用类型 | 语法 | 等价 Lambda 表达式 | 示例 | 说明 |
|---|---|---|---|---|
| 静态方法引用 | ClassName::staticMethod | (args) -> ClassName.staticMethod(args) | MathUtils::add | 引用静态方法 |
| 未绑定方法引用 | ClassName::instanceMethod | (obj, args) -> obj.instanceMethod(args) | String::toUpperCase | 未指定对象,第一个参数是调用者 |
| 绑定方法引用 | instance::instanceMethod | (args) -> instance.instanceMethod(args) | john::getName | 引用某个已知对象的方法 |
| 构造函数引用 | ClassName::new | (args) -> new ClassName(args) | Person::new | 引用构造器创建新对象 |