Java-Lambda 表達式

Lambda 表達式是 Java 8 引入的一項重要特性,它提供了一種簡潔的方式來表示匿名函數。Lambda 表達式主要用于簡化函數式接口的實現,使代碼更加簡潔和易讀。以下是關于 Lambda 表達式的詳細闡述:


1. Lambda 表達式的基本語法

Lambda 表達式的語法如下:

(parameter_list) -> { 代碼塊 }
  • parameter_list:參數列表,可以包含零個或多個參數,參數類型可以省略(由編譯器自動推斷)。
  • ->:Lambda 操作符,將參數列表與 Lambda 主體分隔開。
  • 代碼塊:Lambda 主體,包含實現函數式接口的代碼。如果只有一行代碼,可以省略 {}return 語句。
示例:
// 無參數
() -> System.out.println("Hello, World!");// 單個參數
(x) -> x * x;// 多個參數
(x, y) -> x + y;// 帶代碼塊
(x, y) -> {int sum = x + y;return sum;
};

2. 函數式接口

Lambda 表達式的核心是函數式接口(Functional Interface)。函數式接口是指 僅包含一個抽象方法 的接口。Java 提供了 @FunctionalInterface 注解來標記函數式接口。

常見的函數式接口:
  • Runnablevoid run()
  • Consumer<T>void accept(T t)
  • Supplier<T>T get()
  • Function<T, R>R apply(T t)
  • Predicate<T>boolean test(T t)
示例:
@FunctionalInterface
interface MyInterface {void doSomething();
}// 使用 Lambda 表達式實現函數式接口
MyInterface myLambda = () -> System.out.println("Doing something");
myLambda.doSomething();

好好體會一下,lambda式是一個函數,他賦值給一個接口變量,那么這個接口一定要有一個抽象方法去實現,正好把lambda的這個函數賦值給這個未被重寫的抽象類;而且這個接口一定只能有一個未實現方法,為什么呢,因為如果有多個,誰也分不清楚給哪個方法;有點意思!


3. Lambda 表達式的使用場景

(1) 簡化匿名內部類

Lambda 表達式可以替代匿名內部類,使代碼更簡潔。

// 傳統匿名內部類
Runnable r1 = new Runnable() {@Overridepublic void run() {System.out.println("Hello, World!");}
};// 使用 Lambda 表達式
Runnable r2 = () -> System.out.println("Hello, World!");

注意:以上代碼中Runnable 就只是一個普通的函數式接口,只是起到舉例子的效果,可以替換成自定義函數式接口

(2) 遍歷集合

Lambda 表達式結合 forEach() 方法可以簡化集合的遍歷操作。

List<String> list = Arrays.asList("Apple", "Banana", "Orange");// 傳統遍歷
for (String s : list) {System.out.println(s);
}// 使用 Lambda 表達式
list.forEach(s -> System.out.println(s));
(3) 作為方法參數

Lambda 表達式可以作為方法參數傳遞,特別適合用于需要回調函數的場景。

public static void processList(List<String> list, Consumer<String> consumer) {for (String s : list) {consumer.accept(s);}
}// 調用方法
processList(list, s -> System.out.println(s));
(4) 結合 Stream API

Lambda 表達式與 Stream API 結合,可以實現強大的數據處理功能,如過濾、映射、排序等。

List<String> fruits = Arrays.asList("Apple", "Banana", "Orange", "Mango");// 過濾長度大于 5 的字符串
List<String> filtered = fruits.stream().filter(s -> s.length() > 5).collect(Collectors.toList());// 將字符串轉換為大寫
List<String> upperCase = fruits.stream().map(s -> s.toUpperCase()).collect(Collectors.toList());

4. Lambda 表達式的變量作用域

Lambda 表達式可以訪問外部的局部變量、實例變量和靜態變量,但有如下限制:

  1. 局部變量:Lambda 表達式訪問的局部變量必須是 final 或實際上是 final 的(即不可變)。
  2. 實例變量和靜態變量:Lambda 表達式可以訪問并修改實例變量和靜態變量。
示例:
int num = 10; // 局部變量
Runnable r = () -> System.out.println(num); // num 必須是 final 或 effectively final// 錯誤示例
int num2 = 20;
num2 = 30; // 修改 num2
Runnable r2 = () -> System.out.println(num2); // 編譯錯誤:num2 必須是 final

5. 方法引用

方法引用是 Lambda 表達式的一種簡化形式,用于直接引用已有的方法。方法引用的語法如下:

類名::方法名
方法引用的四種形式:
  1. 靜態方法引用ClassName::staticMethod
  2. 實例方法引用instance::instanceMethod
  3. 特定類型的任意對象方法引用ClassName::instanceMethod
  4. 構造方法引用ClassName::new
示例:
List<String> list = Arrays.asList("Apple", "Banana", "Orange");// 使用 Lambda 表達式
list.forEach(s -> System.out.println(s));// 使用方法引用
list.forEach(System.out::println);

好好理解上面的例子,還挺有意思,但是挺無聊;

感覺就是,有一個類他有很多方法,但是我就想要他的其中一個方法。。。。就是為了這個;


6. 注意事項

  1. 簡潔性:Lambda 表達式應盡量保持簡潔,避免過于復雜的邏輯。
  2. 可讀性:如果 Lambda 表達式過長或邏輯復雜,應考慮使用命名方法代替。
  3. 性能:Lambda 表達式的性能與傳統方式相當,但在某些情況下可能會有輕微的開銷。

總結

Lambda 表達式是 Java 8 引入的一項重要特性,它通過簡化函數式接口的實現,使代碼更加簡潔和易讀。Lambda 表達式廣泛應用于集合遍歷、Stream API、回調函數等場景。掌握 Lambda 表達式及其相關特性(如方法引用、函數式接口),可以顯著提升 Java 開發效率和代碼質量。

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

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

相關文章

05 mysql之DDL

一、SQL的四個分類 我們通常可以將 SQL 分為四類&#xff0c;分別是&#xff1a; DDL&#xff08;數據定義語言&#xff09;、DML&#xff08;數據操作語言&#xff09;、 DCL&#xff08;數據控制語言&#xff09;和 TCL&#xff08;事務控制語言&#xff09;。 DDL 用于創建…

1 2 3 4 5順序插入,形成一個紅黑樹

紅黑樹的特性與優點 紅黑樹是一種自平衡的二叉搜索樹&#xff0c;通過額外的顏色標記和平衡性約束&#xff0c;確保樹的高度始終保持在 O(log n)。其核心特性如下&#xff1a; 每個節點要么是紅色&#xff0c;要么是黑色。根節點和葉子節點&#xff08;NIL節點&#xff09;是…

微服務6大拆分原則

微服務6大拆分原則 微服務拆分是指將一個大型應用程序拆分成獨立服務的過程&#xff0c;在微服務拆分時&#xff0c;需要考慮以下6大微服務拆分原則 一、單一職責原則 微服務單一職責原則&#xff0c;是指每個微服務應該專注于解決一個明確定義的業務領域或功能&#xff0c;…

java: Compilation failed: internal java compiler error 報錯解決方案

java: Compilation failed: internal java compiler error 報錯解決方案 如下圖所示&#xff1a; 在編譯的時候提示 java: Compilation failed: internal java compiler error 原因&#xff1a;內部 java 編譯錯誤,一般是編譯版本不匹配。 問題解決 項目中有以下設置JDK版本…

介紹一下ReentrantLock 跟 Synchronized 區別

ReentrantLock 跟 Synchronized 區別 面試回答&#xff1a; 相同點&#xff1a; synchronized 和 ReentrantLock 都是用來保護資源線程安全的。 都可以保證可見性。 synchronized 和 ReentrantLock 都擁有可重入的特點。 從基本語義和概念上說 synchronized: Java 內建的…

第7次課 棧A

課堂學習 棧&#xff08;stack&#xff09; 是一種遵循先入后出邏輯的線性數據結構。 我們可以將棧類比為桌面上的一摞盤子&#xff0c;如果想取出底部的盤子&#xff0c;則需要先將上面的盤子依次移走。我們將盤子替換為各種類型的元素&#xff08;如整數、字符、對象等&…

ts裝飾器

TypeScript 裝飾器是一種特殊類型的聲明&#xff0c;能夠被附加到類聲明、方法、訪問符、屬性或參數上。它本質上是一個函數&#xff0c;會在運行時被調用&#xff0c;并且被裝飾的聲明信息會作為參數傳遞給裝飾器函數。 裝飾器的分類 類裝飾器 類裝飾器作用于類構造函數&…

【金倉數據庫征文】政府項目數據庫遷移:從MySQL 5.7到KingbaseES的蛻變之路

摘要&#xff1a;本文詳細闡述了政府項目中將 MySQL 5.7 數據庫遷移至 KingbaseES 的全過程&#xff0c;涵蓋遷移前的環境評估、數據梳理和工具準備&#xff0c;遷移實戰中的數據源與目標庫連接配置、遷移任務詳細設定、執行遷移與過程監控&#xff0c;以及遷移后的質量驗證、系…

VB與Excel無縫連接實現指南

一、前期準備 引用Excel對象庫&#xff1a; 在VB開發環境中&#xff0c;點擊"項目"→"引用" 勾選"Microsoft Excel XX.X Object Library"&#xff08;XX.X代表版本號&#xff09; 創建Excel應用程序對象&#xff1a; vb Dim xlApp As Excel.…

【MySQL】數據庫、數據表的基本操作

個人主頁&#xff1a;Guiat 歸屬專欄&#xff1a;MySQL 文章目錄 1. MySQL基礎命令1.1 連接MySQL1.2 基本命令概覽 2. 數據庫操作2.1 創建數據庫2.2 查看數據庫2.3 選擇數據庫2.4 修改數據庫2.5 刪除數據庫2.6 數據庫備份與恢復 3. 表操作基礎3.1 創建表3.2 查看表信息3.3 創建…

cursor sign in 網頁登錄成功,sursor軟件里一直登陸不成功沒有登陸信息

今天在使用cursor登陸無法登陸&#xff0c;點擊sigin in打開網址登陸成功后&#xff0c;軟件里一直無法顯示登陸信息。 點擊sigin in 在網址登陸成功后 解決辦法&#xff1a; 方法1.設置windows默認應用為chrome. 辦法2: 刪除代理 cursor上ctrl, 打開設置&#xff0c;找到…

深入理解卷積神經網絡的輸入層:數據的起點與預處理核心

內容摘要 本文圍繞卷積神經網絡輸入層展開&#xff0c;詳細介紹其在網絡中的重要作用&#xff0c;包括接收不同領域數據的形式及傳遞數據的過程。深入解讀數據預處理的關鍵操作&#xff0c;如去均值、歸一化和PCA/白化。助力讀者透徹理解輸入層&#xff0c;為構建高效卷積神經…

解決 MySQL 數據庫無法遠程連接的問題

在使用 MySQL 數據庫時&#xff0c;遇到這樣的問題&#xff1a; 本地可以連接 MySQL&#xff0c;但遠程機器連接時&#xff0c;總是報錯 Host ... is not allowed to connect to this MySQL server。 這通常是因為 MySQL 的用戶權限或配置限制了遠程訪問。 1. 登錄 MySQL 數據…

MCP認證全解析:從零到微軟認證專家

MCP認證全解析&#xff1a;從零到微軟認證專家 什么是MCP認證&#xff1f; Microsoft Certified Professional&#xff08;MCP&#xff09;是由微軟官方頒發的技術認證&#xff0c;旨在驗證IT從業者在微軟技術棧&#xff08;如Azure、Windows Server、SQL Server等&#xff0…

驅動開發系列57 - Linux Graphics QXL顯卡驅動代碼分析(四)顯示區域更新

一&#xff1a;概述 前面在介紹了顯示模式設置&#xff08;分辨率&#xff0c;刷新率&#xff09;之后&#xff0c;本文繼續分析下&#xff0c;顯示區域的繪制&#xff0c;詳細看看虛擬機的畫面是如何由QXL顯卡繪制出來的。 二&#xff1a;相關數據結構介紹 struct qxl_moni…

遠程調用負載均衡LoadBalancer

1. 什么是負載均衡 負載均衡就是將負載&#xff08;工作任務&#xff0c;訪問請求&#xff09;進行分攤到多個操作單元&#xff08;服務器,組件&#xff09;上進行執行。 根據負載均衡發生位置的不同,一般分為服務端負載均衡和客戶端負載均衡。 服務端負載均衡&#xff1a;指的…

【深度學習】【目標檢測】【Ultralytics-YOLO系列】YOLOV3核心文件detect.py解讀

【深度學習】【目標檢測】【Ultralytics-YOLO系列】YOLOV3核心文件detect.py解讀 文章目錄 【深度學習】【目標檢測】【Ultralytics-YOLO系列】YOLOV3核心文件detect.py解讀前言if name ‘main’parse_opt函數main函數run函數不同命令參數的推理結果常規推理命令推理命令(新增…

NextPolish1.4.1 安裝與使用-bioinformatics tools54

01 簡介 NextPolish 是一個用于修正由低準確度長讀段&#xff08;如 ONT 或 CLR&#xff09;組裝出來的基因組序列中堿基錯誤&#xff08;SNV/Indel&#xff09;的工具。它支持&#xff1a; 僅使用短讀段 僅使用長讀段 同時使用短讀段與長讀段 NextPolish 包含兩個核心模塊…

Vue3 el-tree:全選時只返回父節點,半選只返回勾選中的節點(省-市區-縣-鎮-鄉-村-街道)

需求原因&#xff1a;全選時&#xff0c;傳給接口的code數據太多了&#xff1b; 如果加上 check-strictly 父節點與子節點無關聯&#xff0c;可以初步滿足需求 效果如下使用了check-strictly的話&#xff0c;tree就沒有了半選效果 不好的地方&#xff1a;用戶體驗感不好&#x…

使用 docker 安裝 nacos3.x

一、安裝 nacos 1.拉取鏡像 使用如下指令拉取鏡像 docker pull nacos/nacos-server 拉取完成后&#xff0c;可以使用以下命令查看是否拉取到對應的鏡像&#xff0c;默認拉取最新鏡像 docker images 2.新建掛載文件目錄 mkdir -p /home/ubuntu/nacos/conf/mkdir -p /home/…