Java 中的双冒号 (::) 运算符


在 Java 中,双冒号 (::) 运算符,也称为方法引用运算符,是 Java 8 中引入的一个强大的特性。它提供了一种简洁且丰富的方式来引用方法或构造函数,而无需调用它们。此运算符简化了代码并提高了代码可读性,使其成为开发人员的重要工具。在本文中,我们将探讨双冒号运算符的语法,讨论其应用,并提供代码示例以更好地理解。

语法

双冒号运算符由两个冒号 (::) 组成,它们夹在类名或对象引用和方法名之间。它作为引用 Java 中方法或构造函数的简写表示法。

// A functional interface with a single abstract method
interface Printer {
   void print(String message);
}

// A class that implements the Printer interface
class ConsolePrinter {
   public static void printMessage(String message) {
      System.out.println(message);
   }
}

public class Main {
   public static void main(String[] args) {
      Printer printer = ConsolePrinter::printMessage;
      printer.print("Hello, World!");
   }
}

语法说明

在上面的代码中,我们定义了一个名为 Printer 的函数式接口,其中包含一个抽象方法 print()。ConsolePrinter 类实现了此接口并为 printMessage() 方法提供了实现。在 Main 类中,我们使用双冒号运算符创建一个 Printer 的实例,以引用 ConsolePrinter 类的 printMessage() 方法。最后,我们在 printer 实例上调用 print() 方法,该方法依次调用 printMessage() 方法。

算法

  • 要在 Java 中使用双冒号运算符,请按照以下步骤操作:

  • 定义一个只有一个抽象方法的函数式接口。

  • 在一个类中实现该接口并提供方法实现。

  • 使用双冒号运算符引用方法或构造函数。

  • 使用双冒号运算符创建函数式接口的实例。

  • 调用实例上的方法,这将调用引用的方法或构造函数。

方法 1:使用双冒号运算符进行方法引用

方法 1 包括使用双冒号运算符引用类的静态方法。当我们想要传递不依赖于任何实例变量的方法引用时,此方法很有用。

示例

// A functional interface with a single abstract method
interface Calculator {
   int calculate(int a, int b);
}

class MathUtils {
   public static int add(int a, int b) {
      return a + b;
   }
}

public class Main {
   public static void main(String[] args) {
      Calculator calculator = MathUtils::add;
      int result = calculator.calculate(5, 3);
      System.out.println("Result: " + result);
   }
}

输出

Result: 8

解释

Calculator 是一个具有一个抽象方法 calculate() 的函数式接口。静态 MathUtils 函数 add() 将两个数字相加。双冒号运算符创建一个 Calculator 实例,该实例引用 MathUtils 的 add() 方法。我们使用两个数字调用计算器的 compute() 方法。控制台输出结果。

方法 2:使用双冒号运算符和实例变量进行方法引用

方法 2 包括使用双冒号运算符引用特定对象的实例方法。

示例

import java.util.ArrayList;
import java.util.List;

class Person {
   private String name;

   public Person(String name) {
      this.name = name;
   }

   public void printName() {
      System.out.println(name);
   }
}

public class Main {
   public static void main(String[] args) {
      List<Person> persons = new ArrayList<>();
      persons.add(new Person("Alice"));
      persons.add(new Person("Bob"));

      persons.forEach(Person::printName);
   }
}

输出

Alice
Bob

解释

在这个例子中,我们有一个 Individual 类,它有一个 printName() 方法,用于打印个人的姓名。我们创建一个 Individual 对象列表并向其中添加两个实例。使用双冒号运算符,我们在 List 接口的 forEach() 方法中引用 Individual 类的 printName() 方法。这将导致对列表中每个元素的 printName() 方法进行调用,并将它们的名称打印到控制台。

方法 3:使用双冒号运算符引用任何对象的实例方法。

方法 3 包括使用双冒号运算符引用特定类型的任何任意对象的实例方法。

示例

import java.util.Arrays;
import java.util.List;

class StringUtil {
   public boolean isPalindrome(String s) {
      String reversed = new StringBuilder(s).reverse().toString();
      return s.equals(reversed);
   }
}

public class Main {
   public static void main(String[] args) {
      List<String> words = Arrays.asList("level", "hello", "radar", "world");

      StringUtil stringUtil = new StringUtil();
      long count = words.stream().filter(stringUtil::isPalindrome).count();

      System.out.println("Number of palindromic words: " + count);
   }
}

输出

Number of palindromic words: 2

解释

在此代码片段中,StringUtil 类使用 isPalindrome() 测试回文。我们创建一个单词列表并使用流来对使用双冒号运算符推荐的 isPalindrome() 方法排序回文单词。控制台显示回文单词计数。

方法 4:使用双冒号运算符进行构造函数引用。

方法 4 包括使用双冒号运算符引用构造函数。

示例

import java.util.function.Supplier;

class Employee {
   public String name;
   public int age;

   public Employee() {
      // Default constructor
   }

   public Employee(String name, int age) {
      this.name = name;
      this.age = age;
   }

   public String toString() {
      return "Employee [name=" + name + ", age=" + age + "]";
   }
}

public class Main {
   public static void main(String[] args) {
      Supplier employeeSupplier = Employee::new;
      Employee employee = employeeSupplier.get();

      employee.name = "John Doe";
      employee.age = 30;

      System.out.println(employee);
   }
}

输出

Employee [name=John Doe, age=30]

解释

在此示例中,我们有一个 Employee 类,它有一个定义的构造函数。使用双冒号运算符,我们创建了一个 Supplier 函数式接口的实例,该实例引用 Employee 构造函数。然后,我们调用 employeeSupplier 实例上的 get() 方法以获取一个新的 Employee 对象。我们设置员工的姓名和年龄,并使用 toString() 方法将其打印到控制台。

结论

Java 中的双冒号 (::) 运算符是 Java 8 中引入的一个强大的特性。它提供了一种简洁且丰富的方式来引用方法或构造函数,而无需直接调用它们。通过使用双冒号运算符,我们可以改进我们的代码,提高可读性,并利用 Java 中函数式编程的优势。了解双冒号运算符的语法和各种使用方法对于每个 Java 开发人员来说都是至关重要的。因此,请务必在您未来的 Java 项目中探索和使用此功能,以改进您的编码体验。

更新于: 2023-07-31

3K+ 浏览量

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告
© . All rights reserved.