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+ 瀏覽量

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告