Lambda 表達式的語法與使用:更簡潔、更靈活的函數式編程!

全文目錄:

    • 開篇語
    • Lambda 表達式的語法與使用:更簡潔、更靈活的函數式編程
      • 一、Lambda 表達式的語法
        • 1.1 Lambda 表達式的基本語法形式
      • 二、Lambda 表達式的使用
        • 2.1 Lambda 表達式與匿名內部類的對比
          • 代碼示例:使用匿名內部類和 Lambda 表達式實現 `Runnable` 接口
        • 2.2 Lambda 表達式與函數式接口
          • 代碼示例:自定義函數式接口
      • 三、常用的 Lambda 表達式場景
        • 3.1 在集合框架中的使用
          • 代碼示例:使用 Lambda 表達式遍歷集合
        • 3.2 過濾與映射
          • 代碼示例:使用 Lambda 表達式過濾與映射
        • 3.3 排序操作
          • 代碼示例:使用 Lambda 表達式排序
      • 四、函數式編程與 Lambda 表達式
        • 4.1 `Function` 接口
          • 代碼示例:使用 `Function` 接口
        • 4.2 `Predicate` 接口
          • 代碼示例:使用 `Predicate` 接口
        • 4.3 `Consumer` 接口
          • 代碼示例:使用 `Consumer` 接口
      • 五、總結:Lambda 表達式的優勢與應用
    • 文末

開篇語

哈嘍,各位小伙伴們,你們好呀,我是喵手。運營社區:C站/掘金/騰訊云/阿里云/華為云/51CTO;歡迎大家常來逛逛

??今天我要給大家分享一些自己日常學習到的一些知識點,并以文字的形式跟大家一起交流,互相學習,一個人雖可以走的更快,但一群人可以走的更遠。

??我是一名后端開發愛好者,工作日常接觸到最多的就是Java語言啦,所以我都盡量抽業余時間把自己所學到所會的,通過文章的形式進行輸出,希望以這種方式幫助到更多的初學者或者想入門的小伙伴們,同時也能對自己的技術進行沉淀,加以復盤,查缺補漏。

小伙伴們在批閱的過程中,如果覺得文章不錯,歡迎點贊、收藏、關注哦。三連即是對作者我寫作道路上最好的鼓勵與支持!

Lambda 表達式的語法與使用:更簡潔、更靈活的函數式編程

??Lambda 表達式是 Java 8 引入的一個強大特性,它使得 Java 更加簡潔、靈活,尤其是在處理集合、事件和回調時,能夠以更加函數式的方式表達代碼。Lambda 表達式的引入是 Java 語言的一次重大變革,它不僅讓代碼更加簡潔,也增強了 Java 語言的表達力和可維護性。

一、Lambda 表達式的語法

Lambda 表達式的基本語法如下:

(parameters) -> expression

其中:

  • parameters:表示傳遞給 Lambda 表達式的參數,類似于方法的參數列表。
  • ->:Lambda 操作符,用于將參數列表與方法體分隔開。
  • expression:Lambda 表達式的主體,表示 Lambda 執行的代碼。它可以是單行的表達式,也可以是包含多行的代碼塊。
1.1 Lambda 表達式的基本語法形式
  1. 無參數,返回值為空

    () -> System.out.println("Hello, World");
    

    這表示一個沒有參數且執行簡單操作的 Lambda 表達式。

  2. 一個參數,返回值

    x -> x * x
    

    這是一個接受單個參數并返回其平方的 Lambda 表達式。

  3. 多個參數

    (x, y) -> x + y
    

    這是一個接受兩個參數并返回它們和的 Lambda 表達式。

  4. 包含代碼塊

    (x, y) -> {int sum = x + y;return sum;
    }
    

    這是一個包含多行代碼的 Lambda 表達式,其中 return 用于返回結果。


二、Lambda 表達式的使用

Lambda 表達式可以應用于任何需要函數式接口的場景,函數式接口是只包含一個抽象方法的接口。例如,Java 提供的 RunnableCallableComparator 等接口都可以使用 Lambda 表達式來實現。

2.1 Lambda 表達式與匿名內部類的對比

在 Java 中,Lambda 表達式常常用來替代匿名內部類,尤其是在實現接口時。與匿名內部類相比,Lambda 表達式更加簡潔。

代碼示例:使用匿名內部類和 Lambda 表達式實現 Runnable 接口

匿名內部類實現

public class RunnableExample {public static void main(String[] args) {Runnable runnable = new Runnable() {@Overridepublic void run() {System.out.println("Hello from anonymous class");}};new Thread(runnable).start();}
}

Lambda 表達式實現

public class RunnableExample {public static void main(String[] args) {Runnable runnable = () -> System.out.println("Hello from Lambda");new Thread(runnable).start();}
}

??在這個例子中,使用 Lambda 表達式代替匿名內部類,使得代碼更加簡潔。

2.2 Lambda 表達式與函數式接口

Lambda 表達式的目標是函數式接口。一個接口如果只包含一個抽象方法,就稱為函數式接口。例如,RunnableCallableComparator 都是函數式接口。

代碼示例:自定義函數式接口
@FunctionalInterface
interface Calculator {int add(int a, int b);
}public class LambdaExample {public static void main(String[] args) {// 使用 Lambda 表達式實現函數式接口Calculator calculator = (a, b) -> a + b;System.out.println("Sum: " + calculator.add(5, 3));}
}

??在這個例子中,我們定義了一個 Calculator 函數式接口,它有一個 add 方法。然后,我們使用 Lambda 表達式來實現 add 方法。


三、常用的 Lambda 表達式場景

3.1 在集合框架中的使用

Lambda 表達式特別適用于集合框架(如 ListSetMap)的操作,常見的操作包括遍歷、過濾、排序等。Java 8 引入的 Stream API 使得對集合的操作更加直觀。

代碼示例:使用 Lambda 表達式遍歷集合
import java.util.Arrays;
import java.util.List;public class LambdaForEachExample {public static void main(String[] args) {List<String> list = Arrays.asList("Apple", "Banana", "Cherry");// 使用 Lambda 表達式遍歷集合list.forEach(item -> System.out.println(item));}
}

??在這個例子中,我們使用 forEach 方法和 Lambda 表達式遍歷列表,并打印每個元素。

3.2 過濾與映射

通過 Stream API,Lambda 表達式還可以用于對集合元素的過濾、映射和聚合操作。

代碼示例:使用 Lambda 表達式過濾與映射
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class LambdaFilterMapExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);// 使用 Lambda 表達式過濾偶數,并將每個數乘以 2List<Integer> result = numbers.stream().filter(n -> n % 2 == 0).map(n -> n * 2).collect(Collectors.toList());System.out.println(result);  // 輸出:[4, 8, 12]}
}

??在這個例子中,我們使用 filter() 方法來過濾偶數,使用 map() 方法將每個數乘以 2,然后通過 collect() 方法將結果轉換成一個新的列表。

3.3 排序操作

Lambda 表達式還可以與 Comparator 一起使用,簡化排序操作。

代碼示例:使用 Lambda 表達式排序
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;public class LambdaSortExample {public static void main(String[] args) {List<String> list = Arrays.asList("Banana", "Apple", "Cherry");// 使用 Lambda 表達式進行排序list.sort((a, b) -> a.compareTo(b));  // 升序排序System.out.println(list);  // 輸出:[Apple, Banana, Cherry]}
}

??在這個例子中,我們使用 sort() 方法和 Lambda 表達式來對字符串列表進行排序。


四、函數式編程與 Lambda 表達式

Lambda 表達式是 Java 函數式編程的核心,允許我們將函數作為參數傳遞并返回。Java 8 的 FunctionPredicateConsumerSupplier 等接口是函數式編程的關鍵組成部分。

4.1 Function 接口

Function 接口代表接受一個參數并返回一個結果的函數。

代碼示例:使用 Function 接口
import java.util.function.Function;public class FunctionExample {public static void main(String[] args) {Function<String, Integer> stringLength = str -> str.length();System.out.println(stringLength.apply("Hello"));  // 輸出:5}
}
4.2 Predicate 接口

Predicate 接口用于判斷某個條件是否成立。

代碼示例:使用 Predicate 接口
import java.util.function.Predicate;public class PredicateExample {public static void main(String[] args) {Predicate<Integer> isEven = n -> n % 2 == 0;System.out.println(isEven.test(4));  // 輸出:true}
}
4.3 Consumer 接口

Consumer 接口表示接受一個參數并執行某些操作,但不返回結果。

代碼示例:使用 Consumer 接口
import java.util.function.Consumer;public class ConsumerExample {public static void main(String[] args) {Consumer<String> print = str -> System.out.println(str);print.accept("Hello, World!");  // 輸出:Hello, World!}
}

五、總結:Lambda 表達式的優勢與應用

Lambda 表達式使 Java 的代碼更加簡潔、清晰和函數式。通過 Lambda 表達式,我們能夠:

  • 簡化匿名內部類的使用,特別是在實現函數式接口時。
  • 與 Stream API 一起,使得對集合的操作(如過濾、映射、排序等)更加簡潔和高效。
  • 提高代碼的可讀性和可維護性。

Lambda 表達式在 Java 8 中的引入是 Java 語言的一次重大改進,它使得 Java 更加符合現代編程范式,尤其是在處理集合和事件時,能夠提供更簡潔、直觀的表達方式。

… …

文末

好啦,以上就是我這期的全部內容,如果有任何疑問,歡迎下方留言哦,咱們下期見。

… …

學習不分先后,知識不分多少;事無巨細,當以虛心求教;三人行,必有我師焉!!!

wished for you successed !!!


??若喜歡我,就請關注我叭。

??若對您有用,就請點贊叭。
??若有疑問,就請評論留言告訴我叭。


版權聲明:本文由作者原創,轉載請注明出處,謝謝支持!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/84914.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/84914.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/84914.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從0到1開發一個自己的工具 MCP 并發布到 test PyPi(Python個人版)

目錄 1. 我理解的 MCP2. 寫一個自己的MCP然后發布到 PyPi 上&#xff0c;包括加法工具和獲取當前 ip 工具2.1 先碎碎念一下 uv2.2 初始化項目&#xff08;全程在 cmd 下運行命令&#xff09;2.3 添加 mcp 依賴2.4 添加 server.py&#xff0c;先把加法功能添加上2.5 運行并測試加…

RabbitMQ緩存詳解:由來、發展、核心場景與實戰應用

一、RabbitMQ的由來與發展歷程 1.1 RabbitMQ的誕生背景 RabbitMQ誕生于金融行業的需求,最初由Rabbit Technologies Ltd開發,后被SpringSource收購,最終成為Pivotal的一部分。它的設計初衷是為了解決分布式系統中消息可靠傳輸的問題。在早期金融交易系統中,系統間的通信需…

機器學習與深度學習18-線性代數01

目錄 前文回顧1.特征向量和特征值2.矩陣與模型3.內積和外積4.向量的范數5.正交矩陣 前文回顧 上一篇文章地址&#xff1a;鏈接 1.特征向量和特征值 在機器學習中&#xff0c;特征向量和特征值是用于描述數據集中的特征或變量之間關系的重要概念。它們在降維技術&#xff08;…

如何讓 VS Code 僅通過滾輪放大字體,而不縮放整個界面?

在 VS Code 中&#xff0c;默認情況下使用 Ctrl滾輪&#xff08;Windows/Linux&#xff09;或 Cmd滾輪&#xff08;Mac&#xff09;會同時縮放整個界面&#xff08;包括 UI 元素和編輯器字體&#xff09;。如果你希望僅放大編輯器字體而不影響界面縮放&#xff0c;可以通過以下…

Vue3中v-bind指令用法詳解

在 Vue 3 中&#xff0c;v-bind 是一個核心指令&#xff0c;用于動態綁定 HTML 屬性或組件的 props 到 Vue 實例的數據。以下是詳細講解&#xff1a; 一、基礎用法 1. 綁定單個屬性 vue 復制 下載 <template><!-- 綁定 img 的 src 屬性 --><img v-bind:src…

算法題(169):最大子段和(分治思想)

審題&#xff1a; 本題需要我們找到區間的最大子段和并輸出結果 思路&#xff1a; 方法一&#xff1a;分治思想 我們可以把給定區間平均分成兩部分&#xff0c;然后獲取左段區間的最大子段和&#xff0c;右段區間的最大子段和&#xff0c;以及跨區間的最大子段和。最后比較出他…

Linux 線程深度解析:從內存管理到線程控制的核心機制

文章目錄 引言一、Linux 線程概念1.1 什么是線程1.2 分頁式存儲管理1.2.1 虛擬地址和頁表的由來1.2.2 物理內存管理struct page 的主要用途 1.2.3 頁表1.2.4 頁目錄結構1.2.5 兩級頁表的地址轉換1.2.6 缺頁異常 1.3 線程的優點1.4 線程缺點1.5 線程異常1.6 線程用途 二、Linux進…

玩轉計算機視覺——按照配置部署paddleOCR(英偉達環境與昇騰300IDUO環境)

英偉達環境安裝 創建虛擬環境 conda create -n paddleOCR python3.10 -y conda activate paddleOCRconda install jupyterlab -y conda install ipykernel -y python -m ipykernel install --user --name paddleOCR --display-name "paddle OCR"下載PaddleOCR的GPU…

Java機器學習全攻略:從基礎原理到實戰案例詳解

在當今AI驅動的技術浪潮中,機器學習已成為Java開發者必須掌握的核心技能之一。本文將系統性地介紹Java機器學習的原理基礎、常用框架,并通過多個實戰案例展示如何在實際項目中應用這些技術。無論你是剛接觸機器學習的Java開發者,還是希望鞏固基礎的中級工程師,這篇文章都將…

eBPF 技術詳解及其在網絡安全領域的應用與挑戰

摘要 eBPF&#xff08;extended Berkeley Packet Filter&#xff09;是 Linux 內核中的一項革命性技術&#xff0c;它允許用戶在不修改內核代碼或加載內核模塊的情況下&#xff0c;安全、高效地運行自定義程序。eBPF 的出現極大地擴展了 Linux 內核的可編程性&#xff0c;使其…

error:MISCONF Redis is configured to save RDB snapshots

一、背景 在使用redis異步驅動方式下&#xff0c;執行hset指令時&#xff0c;報錯 redisAsyncCommand((redisAsyncContext *)c, dumpReply, "hset role:10001", "hset role:10001 name %s age %d sex %s", "mark", 31, "male");二、原…

Android-Mod-Menu 使用教程

目錄 簡介前提條件安裝步驟1. 下載和解壓項目2. 配置 Android Studio3. 安裝到設備 修改游戲 APK1. 確定游戲主活動2. 集成模組菜單方法 1&#xff1a;通過服務啟動&#xff08;推薦&#xff09;方法 2&#xff1a;通過活動啟動&#xff08;僅在游戲檢測模組時使用&#xff09;…

SpringBoot 自動化部署實戰:從環境搭建到 CI/CD 全流程

SpringBoot 自動化部署全流程實戰 一、環境準備&#xff08;開發側&#xff09; 基礎工具鏈安裝&#xff1a; # JDK 17 brew install openjdk17 # Maven 構建工具 brew install maven # Docker 環境 brew install --cask docker項目配置驗證&#xff1a; <!-- pom.xml 關…

Flutter動畫與交互:打造流暢用戶體驗的完整指南

在移動應用開發中&#xff0c;流暢的動畫和自然的交互是提升用戶體驗的關鍵因素。Flutter作為Google推出的跨平臺UI工具包&#xff0c;提供了一套強大而靈活的動畫系統&#xff0c;使開發者能夠輕松創建專業級的動畫效果。本文將深入探討Flutter中的動畫與交互技術&#xff0c;…

山東大學軟件學院項目實訓:基于大模型的模擬面試系統項目總結(九)

在山東大學軟件學院的項目實訓中&#xff0c;團隊成員們圍繞基于大模型的模擬面試系統展開了一系列開發與優化工作。以下是本周項目的核心進展與成果總結。 前端界面優化與 Bug 修復&#xff08;吳尤&#xff09; Logo 顯示問題修復 在項目開發過程中&#xff0c;團隊發現項…

14.vue.js的watch()的注意事項(1)

一、 Q &#xff1a;因為 state 有內部的屬性 也就是id。 因為要追逐id。所以要寫函數&#xff1f;而不能直接監聽state。 只監聽state &#xff0c;監聽不到id的變化嗎&#xff1f; A&#xff1a; 為什么監聽 state 不等于監聽 state.id&#xff1f; 在 Vue 3 中&#xff0…

強化學習入門:價值、回報、策略概念詳解

前言 最近想開一個關于強化學習專欄&#xff0c;因為DeepSeek-R1很火&#xff0c;但本人對于LLM連門都沒入。因此&#xff0c;只是記錄一些類似的讀書筆記&#xff0c;內容不深&#xff0c;大多數只是一些概念的東西&#xff0c;數學公式也不會太多&#xff0c;還望讀者多多指教…

基于“數智立體化三維架構”框架的醫療數智化機制研究

1 研究背景與框架基礎 當前,全球醫療服務體系正經歷深刻的數智化轉型浪潮,人工智能、大數據、云計算等新一代信息技術與醫療健康領域的融合不斷深入,催生了醫療服務模式的革命性變化。在我國,數智化技術已成為提升基層衛生服務質量、促進醫療服務公平可及、增進百姓健康福…

OpenCV CUDA模塊圖像變形------對圖像進行旋轉操作函數rotate()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 該函數用于對圖像進行 GPU 加速的旋轉操作&#xff0c;支持指定旋轉角度、縮放中心偏移和插值方法。是 OpenCV CUDA 模塊中用于圖像旋轉的核心函…

【面板數據】中國與世界各國新能源汽車進出口數據-分類別與不分類別(2017-2024年)

新能源汽車作為中國制造高質量發展的重要代表&#xff0c;其進出口數據不僅反映了我國技術實力與產業格局的變化&#xff0c;也是理解全球綠色交通趨勢、制定國家戰略決策的重要依據。目前國內主流定義判斷標準主要參考中國工信部于2009年發布的《新能源汽車生產企業及產品準入…