Java 教程

Java 控制语句

面向对象编程

Java 内置类

Java 文件处理

Java 错误和异常

Java 多线程

Java 同步

Java 网络

Java 集合

Java 接口

Java 数据结构

Java 集合算法

高级 Java

Java 杂项

Java API 和框架

Java 类引用

Java 有用资源

Java - 方法引用



方法引用是在 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");
      // 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

实例方法的方法引用

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

语法

<<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");

      // 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]
广告