JDK8 Lambda基礎

一、Lambda表達式簡介

Lambda表達式是JDK8新加入的一個特性,它是一種新的語言元素,它將匿名函數作為一等公民看待,可以像傳遞變量一樣將它作為參數傳遞、作為返回值返回、賦值給變量等。Lambda表達式的定義形式為:參數列表 -> 函數體。

例如:

int result = Arrays.asList("apple", "banana", "orange").stream()
            .filter(str -> str.length() > 5)
            .mapToInt(String::length)
            .sum();

上述代碼中,Lambda表達式 str -> str.length() > 5 就是過濾條件。

二、Lambda表達式的語法

Lambda表達式的語法包括3個部分:參數列表、箭頭符號和函數體,具體詳解如下:

  1. 參數列表:表示該Lambda表達式接收哪些參數。可以為空,也可以包含且只包含一個參數、多個參數,參數類型可以明確指定(如:String str)或根據上下文自動推斷出來。
  2. 箭頭符號:表示下文所要執行的操作。即原來匿名類的方法體,複製左側參數列表到右側所要執行的操作,中間使用 -> 符號隔開
  3. 函數體:表示Lambda表達式的執行體,可以是一條語句、一組語句、或者一個表達式。

例如:

// 無參數的Lambda表達式
Runnable r = () -> { System.out.println("Hello Lambda!"); };

// 一個參數的Lambda表達式
Consumer c = (str) -> System.out.println("Hello " + str);

// 多個參數的Lambda表達式
Comparator comp = (x, y) -> {
    if (x  y) {
        return 1;
    } else {
        return 0;
    }
};

三、Lambda表達式的應用

1、Lambda表達式與集合

Lambda表達式在集合中的應用十分廣泛,可以用來實現各種集合相關的功能,例如過濾、遍歷、計算、排序等。以下是一些示例代碼:

1.1 過濾
List fruits = Arrays.asList("apple", "banana", "peach", "cherry", "orange");
// 使用Lambda表達式過濾字符串列表中長度大於5的元素
List result1 = fruits.stream().filter(str -> str.length() > 5).collect(Collectors.toList());

// 使用Lambda表達式過濾整數列表中大於50的元素
List nums = Arrays.asList(10, 20, 30, 40, 50, 60, 70, 80, 90, 100);
List result2 = nums.stream().filter(num -> num > 50).collect(Collectors.toList());
1.2 遍歷
List fruits = Arrays.asList("apple", "banana", "peach", "cherry", "orange");
// 使用Lambda表達式遍歷字符串列表
fruits.forEach(str -> System.out.println(str));

// 使用Lambda表達式遍歷整數列表
List nums = Arrays.asList(10, 20, 30, 40, 50, 60, 70, 80, 90, 100);
nums.forEach(num -> System.out.println(num));
1.3 計算
// 使用Lambda表達式計算整數列表中元素的和
List nums = Arrays.asList(1, 2, 3, 4, 5);
int sum = nums.stream().mapToInt(num -> num).sum();

// 使用Lambda表達式計算字符串列表中所有元素的長度總和
List fruits = Arrays.asList("apple", "banana", "peach", "cherry", "orange");
int lengthSum = fruits.stream().mapToInt(str -> str.length()).sum();
1.4 排序
List fruits = Arrays.asList("apple", "banana", "peach", "cherry", "orange");
// 使用Lambda表達式對字符串列表進行排序
List result1 = fruits.stream().sorted((s1, s2) -> s1.compareTo(s2)).collect(Collectors.toList());

List nums = Arrays.asList(10, 5, 20, 30, 15, 25);
// 使用Lambda表達式對整數列表進行排序
List result2 = nums.stream().sorted((n1, n2) -> {
    if (n1  n2) {
        return 1;
    } else {
        return 0;
    }
}).collect(Collectors.toList());

2、Lambda表達式與函數式接口

函數式接口是一個只包含一個抽象方法的接口,可以通過Lambda表達式實現該接口中的抽象方法,並將Lambda表達式賦值給該接口的實例變量,從而實現函數式編程。

例如java.util.function包中提供了很多常用的函數式接口,例如:Function、Supplier、Consumer、Predicate等。其中Function用於將輸入轉換為輸出,Supplier用於提供輸出,Consumer用於處理輸入,Predicate用於判斷是否符合條件。

以下是一些示例代碼:

2.1 Function接口
// 將整數轉換成字符串
Function f1 = num -> String.valueOf(num);

// 將字符串轉換成整數
Function f2 = str -> Integer.parseInt(str);

// 計算字符串長度並返回對應的整數
Function f3 = str -> str.length();
2.2 Supplier接口
// 提供當前時間的Supplier接口實現
Supplier s1 = () -> new Date();

// 提供一個隨機數的Supplier接口實現
Supplier s2 = () -> new Random().nextInt(100);
2.3 Consumer接口
// 輸出整數列表中所有元素
Consumer<List> c1 = list -> {
    for (Integer num : list) {
        System.out.println(num);
    }
};

// 輸出字符串列表中所有元素
Consumer<List> c2 = list -> {
    for (String str : list) {
        System.out.println(str);
    }
};
2.4 Predicate接口
// 判斷字符串是否為空
Predicate p1 = str -> str == null || str.isEmpty();

// 判斷整數是否是偶數
Predicate p2 = num -> num % 2 == 0;

四、Lambda表達式的優缺點

1、優點

  1. 簡化代碼:Lambda表達式可以讓代碼更加簡潔、易讀,避免了冗長的匿名類形式;
  2. 提高可讀性:Lambda表達式的語法更加緊湊、易於理解,可以更好地表達代碼的意圖;
  3. 提高靈活性:Lambda表達式的功能更加靈活,可以方便地傳遞方法引用、參數等。

2、缺點

  1. 缺乏可讀性:Lambda表達式中的箭頭符號和參數列表可能會使代碼難以理解;
  2. 不易調試:Lambda表達式中的代碼不容易調試,一旦出現錯誤需要非常小心地排查;
  3. 性能問題:Lambda表達式在執行時可能會帶來一些性能問題,但可以通過編寫高效的Lambda表達式來避免。

五、總結

Lambda表達式是JDK8中一個很重要的特性,可以用來簡化代碼、提高可讀性、提高靈活性等。需要注意的是,Lambda表達式雖然帶來了許多好處,但也存在一些缺點,需要根據實際情況進行選擇。

原創文章,作者:RWWC,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/148056.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
RWWC的頭像RWWC
上一篇 2024-11-02 13:14
下一篇 2024-11-02 13:14

相關推薦

  • Python基礎代碼用法介紹

    本文將從多個方面對Python基礎代碼進行解析和詳細闡述,力求讓讀者深刻理解Python基礎代碼。通過本文的學習,相信大家對Python的學習和應用會更加輕鬆和高效。 一、變量和數…

    編程 2025-04-29
  • 數據結構與算法基礎青島大學PPT解析

    本文將從多個方面對數據結構與算法基礎青島大學PPT進行詳細的闡述,包括數據類型、集合類型、排序算法、字符串匹配和動態規劃等內容。通過對這些內容的解析,讀者可以更好地了解數據結構與算…

    編程 2025-04-29
  • Python零基礎PDF下載

    本文將為大家介紹如何使用Python下載PDF文件,適合初學者上手實踐。 一、安裝必要的庫 在Python中,我們需要使用urllib和requests庫來獲取PDF文件的鏈接,並…

    編程 2025-04-29
  • 樹莓派DIY無人機一:製作基礎

    本文將介紹如何使用樹莓派製作一個可飛行的小型無人機。本文將介紹樹莓派的選型、比例積木的使用、無線電通信以及如何控制飛行器的基本運動。 一、樹莓派的選型 在DIY無人機中,樹莓派是必…

    編程 2025-04-29
  • Polyphone音頻編輯器基礎入門教程

    Polyphone是一款免費的音頻編輯器,可用於編輯.sf2和.sfz格式的音色庫。本文將詳細介紹Polyphone的基礎操作及使用方法。 一、安裝和簡介 首先,我們需要下載並安裝…

    編程 2025-04-29
  • Python語言設計基礎第2版PDF

    Python語言設計基礎第2版PDF是一本介紹Python編程語言的經典教材。本篇文章將從多個方面對該教材進行詳細的闡述和介紹。 一、基礎知識 本教材中介紹了Python編程語言的…

    編程 2025-04-28
  • Python基礎語言

    Python作為一種高級編程語言擁有簡潔優雅的語法。在本文中,我們將從多個方面探究Python基礎語言的特點以及使用技巧。 一、數據類型 Python基礎數據類型包括整數、浮點數、…

    編程 2025-04-28
  • 鍵值存儲(kvs):從基礎概念到實戰應用

    本文將從基礎概念入手,介紹鍵值存儲(kvs)的概念、原理以及實戰應用,並給出代碼實現。通過閱讀本文,您將了解鍵值存儲的優缺點,如何選擇最適合的鍵值存儲方案,以及如何使用鍵值存儲解決…

    編程 2025-04-28
  • Python基礎考點用法介紹

    Python作為一門腳本語言,其易學易用、開發快速的特點吸引了大量開發者。本文將從Python基礎考點出發,詳細闡述Python的特點、數據類型、運算符、流程控制、函數、模塊等方面…

    編程 2025-04-28
  • Python動態輸入: 從基礎使用到應用實例

    Python是一種高級編程語言,因其簡單易學和可讀性而備受歡迎。Python允許程序員通過標準輸入或命令行獲得用戶輸入,這使得Python語言無法預測或控制輸入。在本文中,我們將詳…

    編程 2025-04-28

發表回復

登錄後才能評論