Java 教程

Java 控制語句

面向物件程式設計

Java 內建類

Java 檔案處理

Java 錯誤與異常

Java 多執行緒

Java 同步

Java 網路程式設計

Java 集合

Java 介面

Java 資料結構

Java 集合演算法

高階 Java

Java 其他

Java API 與框架

Java 類引用

Java 有用資源

Java – Lambda 表示式



Java Lambda 表示式

Lambda 表示式在 Java 8 中引入,被譽為 Java 8 最大的特性。Lambda 表示式促進了函數語言程式設計,並大大簡化了開發。Lambda 表示式基於函式式介面的原理。函式式介面是一個介面,只有一個方法需要實現。Lambda 表示式提供了函式式介面方法的實現。

Lambda 表示式大大簡化了函數語言程式設計,並使程式碼更易讀,無需任何樣板程式碼。Lambda 表示式可以推斷使用的引數型別,並且可以在沒有 return 關鍵字的情況下返回值。對於簡單的單語句方法,甚至可以省略大括號。

Lambda 表示式語法

Lambda 表示式的語法特徵如下。

parameter -> expression body

Java Lambda 表示式的特性

以下是 Lambda 表示式的重要特性。

  • 可選型別宣告 – 無需宣告引數的型別。編譯器可以從引數的值中推斷出來。

  • 可選的引數圓括號 – 無需在圓括號中宣告單個引數。對於多個引數,需要圓括號。

  • 可選的大括號 – 如果表示式體包含單個語句,則無需使用大括號。

  • 可選的 return 關鍵字 – 如果主體只有一個表示式來返回值,編譯器會自動返回值。需要大括號來指示表示式返回值。

Java Lambda 表示式示例

在這個例子中,我們有一個函式式介面 MathOperation,它有一個 operate 方法,可以接受兩個 int 引數,執行操作並將結果作為 int 返回。使用 lambda 表示式,我們建立了 MathOperation operate 方法的四個不同實現,用於新增、減去、乘以和除以兩個整數並獲得相應的結果。然後我們有另一個函式式介面 GreetingService,它有一個 sayMessage 方法,我們用它來列印訊息到控制檯。

package com.tutorialspoint;

public class JavaTester {

   public static void main(String args[]) {
      JavaTester tester = new JavaTester();
		
      //with type declaration
      MathOperation addition = (int a, int b) -> a + b;
		
      //with out type declaration
      MathOperation subtraction = (a, b) -> a - b;
		
      //with return statement along with curly braces
      MathOperation multiplication = (int a, int b) -> { return a * b; };
		
      //without return statement and without curly braces
      MathOperation division = (int a, int b) -> a / b;
		
      System.out.println("10 + 5 = " + tester.operate(10, 5, addition));
      System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction));
      System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication));
      System.out.println("10 / 5 = " + tester.operate(10, 5, division));
		
      //without parenthesis
      GreetingService greetService1 = message -> System.out.println("Hello " + message);
		
      //with parenthesis
      GreetingService greetService2 = (message) -> System.out.println("Hello " + message);
		
      greetService1.sayMessage("Mahesh");
      greetService2.sayMessage("Suresh");
   }
	
   interface MathOperation {
      int operation(int a, int b);
   }
	
   interface GreetingService {
      void sayMessage(String message);
   }
	
   private int operate(int a, int b, MathOperation mathOperation) {
      return mathOperation.operation(a, b);
   }
}

輸出

讓我們編譯並執行上面的程式,這將產生以下結果:

10 + 5 = 15
10 - 5 = 5
10 x 5 = 50
10 / 5 = 2
Hello Mahesh
Hello Suresh

以下是上述示例中需要注意的重要幾點。

  • Lambda 表示式主要用於定義函式式介面的內聯實現,即只有一個方法的介面。在上面的示例中,我們使用了各種型別的 lambda 表示式來定義 MathOperation 介面的 operation 方法。然後我們定義了 GreetingService 的 sayMessage 的實現。

  • Lambda 表示式消除了對匿名類的需求,併為 Java 提供了一種非常簡單而強大的函數語言程式設計能力。

Java Lambda 表示式的範圍

使用 lambda 表示式,您可以引用任何 final 變數或有效 final 變數(只賦值一次)。如果變數第二次賦值,lambda 表示式會丟擲編譯錯誤。

在 Lambda 表示式中使用常量

在這個例子中,我們有一個函式式介面 GreetingService,它有一個 sayMessage 方法,我們用它來列印訊息到控制檯。現在在 Java Tester 類中,我們有一個 final 類欄位 salutation,它的值是 "Hello! "。現在在 lambda 表示式中,我們可以在沒有任何錯誤的情況下使用這個 final 欄位。

在 Lambda 表示式中使用常量的示例

public class JavaTester {

   final static String salutation = "Hello! ";
   
   public static void main(String args[]) {
      GreetingService greetService1 = message -> System.out.println(salutation + message);
      greetService1.sayMessage("Mahesh");
   }
	
   interface GreetingService {
      void sayMessage(String message);
   }
}

輸出

讓我們編譯並執行上面的程式,這將產生以下結果:

Hello! Mahesh

在集合中使用 Lambda 表示式

從 Java 8 開始,幾乎所有集合都增強了對lambda表示式的支援,可以使用lambda表示式來執行集合操作。例如,迭代列表、過濾列表、排序列表等等。本例展示瞭如何使用lambda表示式迭代字串列表並列印所有元素,以及如何列印列表中所有偶數。

在集合中使用Lambda表示式的示例

package com.tutorialspoint;

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

public class JavaTester {

   public static void main(String args[]) {
    
	   // prepare a list of strings
	   List<String> list = new ArrayList<>();
	   list.add("java");
	   list.add("html");
	   list.add("python");
      
	   // print the list using a lambda expression
	   // here we're passing a lambda expression to forEach 
	   // method of list object
	   list.forEach(i -> System.out.println(i));
	   
	   List<Integer> numbers = new ArrayList<>();
	   numbers.add(1);
	   numbers.add(2);
	   numbers.add(3);
	   numbers.add(4);
	   numbers.add(5);
	   numbers.add(6);
	   numbers.add(7);
	   numbers.add(8);
	   System.out.println(numbers);
	   
	   // filter the list using a lambda expression
	   // here we're passing a lambda expression to removeIf 
	   // method of list object where we can checking 
	   // if number is divisible by 2 or not	  
	   numbers.removeIf( n -> n%2 != 0);
	   System.out.println(numbers);
   }
}

輸出

讓我們編譯並執行上面的程式,這將產生以下結果:

java
html
python
[1, 2, 3, 4, 5, 6, 7, 8]
[2, 4, 6, 8]
廣告