Java 简明教程

Java - Method References

方法引用引入在 Java 8 中。方法引用是一种特殊的 lambda expression。它实现了 lambda 表达式的目的,通过提高可读性和编写整洁的代码。

方法引用适用于 functional interfaces。在任何情况下,如果我们使用 lambda 表达式调用函数接口中的方法,我们可以使用方法引用。

方法引用有助于根据其名称指向方法,而无需指定参数。参数由 lambda 表达式传递。方法引用使用“::”符号进行描述。

Types of Java Method References

方法引用可用于指向下列类型的函数 −

  1. Static methods

  2. Instance methods

  3. 使用 new 运算符构造函数 (TreeSet::new)

Method Reference for Static Method

可以使用 “::”符号轻松引用静态 method,而无需创建任何 class 实例,并且可以使用类名。

Syntax

<<class-name>>::methodName

Example: Reference to a Static Method

在这个示例中,我们通过三种方式引用类中的静态方法来打印元素。第一种方法是使用 for loop 打印元素的常规方法。第二种方法是在 for each loop 中使用 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");
      // 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);
   }
}

让我们编译并运行上述程序,这将生成以下结果 −

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

类似于静态方法,我们可以使用对方法的引用来引用对象的一个实例方法。

Syntax

<<object-name>>::methodName

Example: Reference to an Instance Method

在此示例中,我们引用 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]

Method Reference for Constructor

我们还可以使用对方法的引用来调用构造函数。这类似于静态方法调用,但这里我们使用 new 而不是方法名称。

Syntax

<<class-name>>::new

Example: Reference to a Constructor

在此示例中,我们正在根据学生姓名创建 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");

      // 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;
   }
}

让我们编译并运行上述程序,这将生成以下结果 −

[Mahesh, Suresh, Ramesh, Robert, Jon]