159. Java Lambda 表达式 - 方法引用的四种类型

103 阅读2分钟

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)

✅ 场景说明:

引用构造函数创建新对象,常用于 SupplierFunctionBiFunction 等函数式接口中。

✅ 示例:

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引用构造器创建新对象