方法引用是在 Java 8 中引入的一种特殊的 Lambda 表达式。它们通过提高代码的可读性和整洁度来实现 Lambda 表达式的功能。
当调用功能性接口的方法时,我们可以使用方法引用来替代 Lambda 表达式。方法引让用户可以通过名称指向方法,甚至不需要指定参数。参数是由 Lambda 表达式传递的。方法引用使用 ::
符号进行描述。
Java 方法引用的类型
方法引用可以用来指向以下几种类型的方法:
-
-
-
使用
new
操作符的构造器(例如 TreeSet::new
)
静态方法的方法引用
静态方法可以通过使用 ::
符号轻松引用,无需创建类的任何实例,并且使用类名。
语法
<class-name>::methodName
示例:静态方法的引用
在这个例子中,我们通过三种方式引用静态方法来打印元素。第一种方法是使用 for 循环的传统方法来打印所有元素。第二种方法是在 for-each 循环中使用 Lambda 表达式来打印元素。第三种方法是在 for-each 循环中使用方法引用来打印所有元素。
package com.tutorialspoint;
import java.util.ArrayList;
import java.util.List;
public class Tester {
public static void main(String args[]) {
List<String> names = new ArrayList<>();
names.add("Mahesh");
names.add("Suresh");
names.add("Ramesh");
names.add("Naresh");
names.add("Kalpesh");
System.out.println("Printing using for each loop");
for (String name: names) {
System.out.println(name);
}
System.out.println("Printing using for each loop with lambda expression");
names.forEach(s->System.out.println(s));
System.out.println("Printing using for each loop with method reference" );
names.forEach(System.out::println);
}
}
输出
编译并运行以上程序,将产生以下结果:
Printing using for each loop
Mahesh
Suresh
Ramesh
Naresh
Kalpesh
Printing using for each loop with lambda expression
Mahesh
Suresh
Ramesh
Naresh
Kalpesh
Printing using for each loop with method reference
Mahesh
Suresh
Ramesh
Naresh
Kalpesh
实例方法的方法引用
与静态方法类似,我们可以使用方法引用来引用对象的实例方法。
语法
<object-name>::methodName
示例:实例方法的引用
在这个例子中,我们通过两种方式引用 Integer
类的实例方法来比较元素。第一种方法是使用带有显式方法调用的 Lambda 表达式和 sorted
方法来比较元素。第二种方法是使用方法引用。
package com.tutorialspoint;
import java.util.Arrays;
import java.util.List;
public class Tester {
public static void main(String args[]) {
List<Integer> numbers = Arrays.asList(1,2,4,9,8,7,3);
System.out.println("Sorted using lambda expression");
numbers = numbers.stream().sorted((a,b) -> a.compareTo(b)).toList();
System.out.println(numbers);
numbers = Arrays.asList(1,2,4,9,8,7,3);
System.out.println("Sorted using method reference" );
numbers = numbers.stream().sorted(Integer::compareTo).toList();
System.out.println(numbers);
}
}
输出
编译并运行以上程序,将产生以下结果:
Sorted using lambda expression
[1, 2, 3, 4, 7, 8, 9]
Sorted using method reference
[1, 2, 3, 4, 7, 8, 9]
构造器的方法引用
我们也可以使用方法引用来调用构造器。这类似于静态方法的调用,但在这里我们使用 new
而不是方法名。
语法
<class-name>::new
示例:构造器的引用
在这个例子中,我们根据学生名字列表来创建 Student
类的新对象。
package com.tutorialspoint;
import java.util.Arrays;
import java.util.List;
public class Tester {
public static void main(String args[]) {
List<String> studentNames = Arrays.asList("Mahesh","Suresh","Ramesh","Robert","Jon");
Student[] students = studentNames.stream().map(Student::new).toArray(Student[]::new);
List<String> list = Arrays.asList(students);
System.out.println(list);
}
}
class Student{
String name;
Student(String name){
this.name = name;
}
public String toString(){
return this.name;
}
}
输出
编译并运行以上程序,将产生以下结果:
[Mahesh, Suresh, Ramesh, Robert, Jon]