一、方法引用概述
Java 8引入了Lambda表达式,Lambda表达式是一种轻量级的匿名函数,它使得我们可以将函数作为参数进行传递和处理。为了更加方便地操纵函数,Java 8还引入了方法引用。方法引用是指可以在不需要向Lambda表达式中传递参数的情况下,直接引用已有方法或构造方法。在方法引用中,方法的名称作为Lambda表达式的参数,或者说方法引用是一种简化Lambda表达式的语法。
二、方法引用的类型
Java 8中,方法引用可以分为如下4类。
1. 类的静态方法引用
public class MethodReference {
public static void printMessage() {
System.out.println("Hello, world!");
}
public static void main(String[] args) {
Runnable runnable = MethodReference::printMessage;
Thread thread = new Thread(runnable);
thread.start();
}
}
在上述代码中,我们引用了一个静态方法printMessage()。在main()方法中,我们创建了一个Runnable接口实例,这个实例中的run()方法使用MethodReference :: printMessage的方法引用作为Lambda表达式,在调用run()方法时,会直接调用printMessage()方法输出字符串“Hello, world!”。
2. 对象实例的方法引用
public class MethodReference {
public void printMessage() {
System.out.println("Hello, world!");
}
public static void main(String[] args) {
MethodReference ref = new MethodReference();
Runnable runnable = ref::printMessage;
Thread thread = new Thread(runnable);
thread.start();
}
}
在这个例子中,我们创建了一个MethodReference类的实例,然后使用对象实例的方法引用创建了一个Runnable接口实例,这个实例中的run()方法在调用时,会直接调用ref实例的printMessage()方法。在这种情况下,Lambda表达式的第一个参数是方法的接收者,第二个参数是方法的参数。
3. 类的任意对象的方法引用
public class MethodReference {
public void printMessage(String message) {
System.out.println(message);
}
public static void main(String[] args) {
Consumer<String> consumer = new MethodReference()::printMessage;
consumer.accept("Hello, world!");
}
}
在这个例子中,我们创建了一个Consumer
4. 构造方法引用
class Person {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
interface PersonFactory<P extends Person> {
P create(String name, int age);
}
public class MethodReference {
public static void main(String[] args) {
PersonFactory<Person> factory = Person::new;
Person person = factory.create("Kobe", 41);
System.out.println(person.getName() + " is " + person.getAge() + " years old.");
}
}
在这个例子中,我们定义了一个Person类和一个PersonFactory接口。PersonFactory接口中有一个create()方法,这个方法可以用来创建Person对象。我们使用了构造方法引用,将Person::new作为Lambda表达式传递给PersonFactory的create()方法,实现了创建Person对象的功能。
三、总结
本文介绍了Java方法引用的概念和4种类型,在实际的开发中,方法引用可以简化代码并提高可读性。理解和掌握方法引用的语法和用法,对于Java 8的学习和开发都是非常有帮助的。