JAVA方法引用详解

在Java中,方法引用是一种强大的功能,它允许您在Lambda表达式中引用方法,而不是在表达式中直接定义这些方法。方法引用使代码更加简洁和可读,尤其在函数式编程中非常有用。
引用类方法
引用类方法是一种最简单的,引用式方法,它允许你引用静态方法。
语法:
引用类方法的语法为:
ClassName::staticMethodName
其中,ClassName是包含静态方法的类的名称,staticMethodName是要引用的静态方法的名称。
示例:
让我们通过一个示例来演示引用类方法的用法。假设有一个名为MathUtils的工具类,其中包含一个静态方法square,用于计算一个数的平方。
// MathUtils.java
public class MathUtils {
public static int square(int num) {
return num * num;
}
}
现在,我们可以使用方法引用来引用这个静态方法:
import java.util.function.IntUnaryOperator;
public class MethodReferenceExample {
public static void main(String[] args) {
IntUnaryOperator squareFunction = MathUtils::square;
int result = squareFunction.applyAsInt(5);
System.out.println("Square of 5 is " + result);
}
}
在上面的示例中,我们首先创建了一个IntUnaryOperator函数式接口的实例squareFunction,并将MathUtils::square作为引用传递给它。然后,我们使用applyAsInt方法调用这个函数,并传入参数5,得到计算结果。
这里,MathUtils::square引用了MathUtils类的静态方法square,并且可以像Lambda表达式一样使用。
引用对象的实例方法
引用对象的实例方法是一种更常见和有用的方法引用方式。它允许您引用已经存在的对象的实例方法,而不是在Lambda表达式中定义新的方法。
语法:
引用对象的实例方法的语法为:
object::instanceMethodName
其中,object是要引用方法的对象的名称或引用,instanceMethodName是要引用的实例方法的名称。
示例:
让我们通过一个示例来演示引用对象的实例方法的用法。假设有一个名为Person的类,其中包含一个实例方法printName,用于打印人的姓名。
public class Person {
private String name;
public Person(String name) {
this.name = name;
}
public void printName() {
System.out.println("Name: " + name);
}
}
现在,我们可以使用方法引用来引用printName方法:
import java.util.function.Consumer;
public class MethodReferenceExample {
public static void main(String[] args) {
Person person = new Person("Alice");
Consumer<Person> printNameFunction = Person::printName;
printNameFunction.accept(person);
}
}
在上面的示例中,我们首先创建了一个Consumer<Person>函数式接口的实例printNameFunction,并将Person::printName作为引用传递给它。然后,我们使用accept方法调用这个函数,并传入一个Person对象,它会打印该对象的姓名。
这里,Person::printName引用了Person类的实例方法printName,并且可以在函数式接口中使用。
引用类的实例方法
引用类的实例方法的语法为:
ClassName::instanceMethodName
其中,ClassName是包含实例方法类的名称,instanceMethodName是要引用的实例方法的名称
示例:
让我们通过一个示例来演示引用类的实例方法的用法。假设有一个名为Person的类,其中包含一个实例方法getName,用于获取人的姓名。
public class Person {
private String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
现在,我们可以使用方法引用来引用getName方法:
import java.util.List;
import java.util.function.Function;
public class MethodReferenceExample {
public static void main(String[] args) {
List<Person> people = List.of(new Person("Alice"), new Person("Bob"));
Function<Person, String> getNameFunction = Person::getName;
for (Person person : people) {
String name = getNameFunction.apply(person);
System.out.println("Name: " + name);
}
}
}
引用构造器
引用构造器是一种特殊的方法引用方式,用于创建对象。它允许您引用类的构造器,以便在Lambda表达式中创建对象。
语法
引用构造器的语法为:
ClassName::new
其中,ClassName是要引用构造器的类的名称
示例:
让我们通过一个示例来演示引用构造器的用法。假设有一个名为Person的类,它有一个带参数的构造器。
public class Person {
private String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
现在,我们可以使用方法引用来引用Person类的构造器:
import java.util.function.Supplier;
public class MethodReferenceExample {
public static void main(String[] args) {
Supplier<Person> personSupplier = Person::new;
Person person = personSupplier.get();
System.out.println("Created person with name: " + person.getName());
}
}
在上面的示例中,我们创建了一个Supplier<Person>函数式接口的实例personSupplier,并将Person::new作为引用传递给它。然后,我们使用get方法调用personSupplier来创建一个`Person对象。
这里,Person::new引用了Person类的构造器,并且可以在函数式接口中使用。