Java 简明教程
Java - Method References
方法引用引入在 Java 8 中。方法引用是一种特殊的 lambda expression。它实现了 lambda 表达式的目的,通过提高可读性和编写整洁的代码。
Method references were introduced in java 8. Method reference is a special type of lambda expression. It fulfils the purpose of a lambda expression by increasing the readability and to write a neat code.
方法引用适用于 functional interfaces。在任何情况下,如果我们使用 lambda 表达式调用函数接口中的方法,我们可以使用方法引用。
A method reference works in case of functional interfaces. Wherever, we are calling a method of a functional interface with a lambda expression, we can use method reference.
方法引用有助于根据其名称指向方法,而无需指定参数。参数由 lambda 表达式传递。方法引用使用“::”符号进行描述。
Method references help to point to methods by their names even without specifying the arguments. Arguments are passed by the lambda expression. A method reference is described using "::" symbol.
Types of Java Method References
方法引用可用于指向下列类型的函数 −
A method reference can be used to point the following types of methods −
-
Static methods
-
Instance methods
-
Constructors using new operator (TreeSet::new)
Method Reference for Static Method
A static method can be referred using "::" symbol easily without creating any instance of the class, and by using class name.
Example: Reference to a Static Method
在这个示例中,我们通过三种方式引用类中的静态方法来打印元素。第一种方法是使用 for loop 打印元素的常规方法。第二种方法是在 for each loop 中使用 lambda 表达式。第三种方法是在 for each 循环中使用方法引用来打印所有元素。
In this example, we’re referencing static method of out class to print the elements in three ways. First approach is regular approach to print the elements using for loop. Second approach is to use a lambda expression in for each loop. Third approach is using method reference in for each loop to print all the elements.
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");
// Approach 1: for loop to print all elements
for (String name: names) {
System.out.println(name);
}
System.out.println("Printing using for each loop with lambda expression");
// Approach 2: lambda expression to print the elements in for each loop
names.forEach(s->System.out.println(s));
System.out.println("Printing using for each loop with method reference" );
// Approach 3: Method reference to print elements in for each loop
names.forEach(System.out::println);
}
}
让我们编译并运行上述程序,这将生成以下结果 −
Let us compile and run the above program, this will produce the following result −
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
Method Reference for Instance Method
类似于静态方法,我们可以使用对方法的引用来引用对象的一个实例方法。
Similar to static methods, we can refer to instance method of an object using Method reference.
Example: Reference to an Instance Method
在此示例中,我们引用 Integer 类的实例方法来以两种方式对元素进行比较。第一种方法是使用具有显式方法调用的 lambda 表达式,通过 sorted 方法比较元素的常规方法。第二种方法是使用对方法的引用。
In this example, we’re referencing instance method of Integer class to compare the elements in two ways. First approach is regular approach to compare the elements using sorted method with a lambda expression having explicit method call. Second approach is using method reference.
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);
}
}
让我们编译并运行上述程序,这将生成以下结果 −
Let us compile and run the above program, this will produce the following result −
Sorted using lambda expression
[1, 2, 3, 4, 7, 8, 9]
Sorted using method reference
[1, 2, 3, 4, 7, 8, 9]
Method Reference for Constructor
我们还可以使用对方法的引用来调用构造函数。这类似于静态方法调用,但这里我们使用 new 而不是方法名称。
We can use method reference to invoke constructor as well. This is similar to static method invocation but here we’re using new instead of method name.
Example: Reference to a Constructor
在此示例中,我们正在根据学生姓名创建 Student 类的对象,同时迭代学生姓名列表。
In this example, we’re creating new objects of Student class based on names of the students while iterating the list of student names.
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");
// create the list of student objects from names
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;
}
}
让我们编译并运行上述程序,这将生成以下结果 −
Let us compile and run the above program, this will produce the following result −
[Mahesh, Suresh, Ramesh, Robert, Jon]