方法引用(Method Reference)是 Java 8 引入的一种简洁的 Lambda 表达式写法。它允许我们直接引用已有的方法,而不必重复实现 Lambda 代码,使代码更加简洁、可读性更强。
方法引用的基本语法如下:
类名::静态方法名
对象名::实例方法名
类名::实例方法名
类名::new // 构造方法引用
注意事项:
Supplier
, Function
, Consumer
等。静态方法可以被方法引用直接调用,适用于方法签名匹配的情况。
示例:
import java.util.function.Function;
public class StaticMethodReference {
public static int square(int num) {
return num * num;
}
public static void main(String[] args) {
Function function = StaticMethodReference::square;
System.out.println(function.apply(5)); // 输出 25
}
}
注意事项:
static
,否则无法使用 类名::方法名
方式引用。当一个对象的实例方法符合 Lambda 预期参数类型时,可以引用该对象的方法。
示例:
import java.util.function.Supplier;
public class InstanceMethodReference {
public String getMessage() {
return "Hello, Method Reference!";
}
public static void main(String[] args) {
InstanceMethodReference instance = new InstanceMethodReference();
Supplier supplier = instance::getMessage;
System.out.println(supplier.get()); // 输出 "Hello, Method Reference!"
}
}
注意事项:
instance::methodName
只能用于方法不带参数或参数匹配函数式接口的情况。Supplier
或 Consumer
这类接口。如果方法在本类或父类中,可以直接用 this
或 super
进行方法引用。
示例(本类方法):
import java.util.function.Function;
public class ThisMethodReference {
public int doubleValue(int num) {
return num * 2;
}
public void execute() {
Function function = this::doubleValue;
System.out.println(function.apply(10)); // 输出 20
}
public static void main(String[] args) {
new ThisMethodReference().execute();
}
}
示例(父类方法):
class Parent {
public void greet() {
System.out.println("Hello from Parent");
}
}
public class SuperMethodReference extends Parent {
public void execute() {
Runnable r = super::greet;
r.run(); // 输出 "Hello from Parent"
}
public static void main(String[] args) {
new SuperMethodReference().execute();
}
}
注意事项:
this::methodName
和 super::methodName
。Runnable
、Consumer
等无参方法。如果 Lambda 表达式的第一个参数是调用方法的对象,则可以使用 类名::实例方法
形式。
示例:
import java.util.Arrays;
import java.util.List;
public class ClassNameMethodReference {
public static void main(String[] args) {
List list = Arrays.asList("apple", "banana", "cherry");
list.forEach(System.out::println); // 逐行打印字符串
}
}
注意事项:
Consumer
、Function
等。类名::方法名
形式适用于 list.forEach(System.out::println)
这种情况。构造方法可以用 类名::new
进行引用。
示例:
import java.util.function.Supplier;
class User {
public User() {
System.out.println("User created");
}
}
public class ConstructorReference {
public static void main(String[] args) {
Supplier supplier = User::new;
User user = supplier.get(); // 输出 "User created"
}
}
注意事项:
Supplier
(无参数构造)。Function
(有参数构造)。数组构造方法可以使用 类型[]::new
进行引用。
示例:
import java.util.function.IntFunction;
public class ArrayConstructorReference {
public static void main(String[] args) {
IntFunction arraySupplier = int[]::new;
int[] arr = arraySupplier.apply(5);
System.out.println("Array length: " + arr.length); // 输出 "Array length: 5"
}
}
注意事项:
IntFunction
形式。int[]::new
、String[]::new
等。方法引用是 Lambda 表达式的简洁替代方案,使代码更具可读性。主要掌握以下几种方法引用:
类名::静态方法
引用静态方法。对象::实例方法
引用特定对象的实例方法。类名::实例方法
引用某个类的任意对象的实例方法。类名::new
引用构造方法。类型[]::new
引用数组构造方法。关键点: