天天看點

關于Java 中的 Lambda 表達式你了解多少?

這篇文章我們将讨論關于Java 中的 Lambda 表達式,Lambda 表達式是 Java 涉足函數式程式設計的過程。它接受參數并将其應用于表達式或代碼塊。以下是文法的基本示例:

(parameter1, parameter2) => expression

或者

(parameter1, parameter2) => {code block}

Lambda 表達式非常有限,如果它不是 void,則必須立即傳回一個值。他們不能使用諸如 if 或 for 之類的關鍵字來保持簡單性。如果需要更多行代碼,則可以改用代碼塊。

現在在實作 lambda 表達式時,不能隻使用表達式。Lambda 是函數式接口的實作。函數式接口是隻有一個抽象方法的接口。lambda 的好處是它們允許你實作方法而無需實作接口的類和執行個體化對象。下面是一個例子:

interface FuncInterface
{
    // 抽象函數
    void abstractFun(int x);
    // 非抽象(或預設)函數
    default void normalFun()
    {
       System.out.println("Hello");
    }
}
class Test
{
    public static void main(String args[])
    {
        // 實作上述功能接口的 lambda 表達式。 
        // 該接口預設實作 abstractFun()
        FuncInterface fobj = (int x)->System.out.println(2*x);
        // 這會調用上面的 lambda 表達式并列印 10。
        fobj.abstractFun(5);
    }
}      

Lambda 表達式通常用作函數的參數。為了提高可讀性,你還可以将 lambda 表達式存儲在變量中,隻要該類型是一個隻有一個方法、相同數量的參數和相同傳回類型的接口。

import java.util.ArrayList;
import java.util.function.Consumer;
public class Main {
  public static void main(String[] args) {
    ArrayList<Integer> numbers = new ArrayList<Integer>();
    numbers.add(5);
    numbers.add(9);
    numbers.add(8);
    numbers.add(1);
    Consumer<Integer> method = (n) -> { System.out.println(n); };
    numbers.forEach( method );
  }
}      

lambda 的一個常見用途是建立線程。這是一個使用 lambda 代碼塊實作 Runnable 對象的示例,供線程執行。

// 可運作的 Lambda
Runnable task2 = () -> { System.out.println("Task #2 is running"); };
// 啟動線程
new Thread(task2).start();      

作為初學者,我們大多數人都被教導使用 OOP 概念進行程式設計,是以使用不同的範式(如函數式程式設計)可能會有些别扭。我自己仍在學習這些概念中。不管怎樣我希望這篇文章能讓大家學到一些東西。如果你有更多問題或想深入研究該主題,歡迎評論或者檢視下方的資料。我提取的代碼示例也來自那裡。