Kotlin 中 Lambda 表達式的語法結構及簡化推導

在 Kotlin 編程中,Lambda 表達式是一項非常實用且強大的功能。今天,我們就來深入探討一下 Lambda 表達式的語法結構,以及它那些令人 “又愛又恨” 的簡化寫法。

一、Lambda 表達式完整語法結構

Lambda 表達式最完整的語法結構定義為{參數名1: 參數類型, 參數名2: 參數類型 -> 函數體} 。這里,最外層的大括號是 Lambda 表達式的標志;如果有參數傳入,需要在大括號內聲明參數列表,參數列表以->符號結尾,該符號同時也表示函數體的開始。在函數體中,我們可以編寫代碼,但不建議編寫過長的代碼,因為最后一行代碼會自動作為 Lambda 表達式的返回值。

二、通過實例理解 Lambda 表達式的應用

以找出單詞最長的水果為例,我們常用的函數式 API 中maxBy函數,本質上就是一個接收 Lambda 類型參數的普通函數。在遍歷集合時,maxBy函數會將每次遍歷的值作為參數傳遞給 Lambda 表達式,根據我們傳入的條件來遍歷集合,從而找到該條件下的最大值。

比如,我們有如下水果列表:

val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape", "Watermelon")

想要找到單詞最長的水果,條件自然是單詞的長度。我們套用 Lambda 表達式完整語法結構來使用maxBy函數:

val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape", "Watermelon")
val lambda = { fruit: String -> fruit.length }
val maxLengthFruit = list.maxBy(lambda)

在這段代碼中,maxBy函數接收了一個 Lambda 參數,該參數完全遵循我們前面學習的表達式語法結構,相對來說比較容易理解。

三、Lambda 表達式的逐步簡化

雖然上述寫法可以正常運行,但略顯啰嗦,有許多可簡化的地方。接下來,我們就通過一步步推導,讓代碼變得更加簡潔。

第一步:直接傳入 Lambda 表達式

我們不需要專門定義一個lambda變量,而是可以直接將 Lambda 表達式傳入maxBy函數當中,簡化后的代碼如下:

val maxLengthFruit = list.maxBy({ fruit: String -> fruit.length })

第二步:調整 Lambda 表達式位置

Kotlin 規定,當 Lambda 參數是函數的最后一個參數時,可以將 Lambda 表達式移到函數括號的外面,代碼進一步簡化為:

val maxLengthFruit = list.maxBy() { fruit: String -> fruit.length }

第三步:省略函數括號

如果 Lambda 參數是函數的唯一一個參數,還能將函數的括號省略,代碼變成:

val maxLengthFruit = list.maxBy { fruit: String -> fruit.length }

此時,代碼看起來清爽了許多。

第四步:利用類型推導省略參數類型

由于 Kotlin 擁有出色的類型推導機制,Lambda 表達式中的參數列表在大多數情況下不必聲明參數類型,代碼可進一步簡化:

val maxLengthFruit = list.maxBy { fruit -> fruit.length }

第五步:使用it關鍵字

當 Lambda 表達式的參數列表中只有一個參數時,也不必聲明參數名,而是可以使用it關鍵字來代替,最終得到的代碼為:

val maxLengthFruit = list.maxBy { it.length }

通過這樣一步步的推導,我們就得到了和一開始那段函數式 API 一模一樣的簡潔寫法,是不是對 Lambda 表達式的理解更加深刻、輕松了呢?

掌握 Lambda 表達式的這些語法和簡化技巧,能讓我們在 Kotlin 編程中寫出更加簡潔、優雅的代碼,提高編程效率。希望今天的分享能幫助大家更好地駕馭 Lambda 表達式!

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

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

相關文章

Kafka Streams 和 Apache Flink 的無狀態流處理與有狀態流處理

Kafka Streams 和 Apache Flink 與數據庫和數據湖相比的無狀態和有狀態流處理的概念和優勢。 在數據驅動的應用中,流處理的興起改變了我們處理和操作數據的方式。雖然傳統數據庫、數據湖和數據倉庫對于許多基于批處理的用例來說非常有效,但在要求低延遲…

【后端高階面經:緩存篇】34、高并發下緩存穿透、擊穿、雪崩怎么解決

一、緩存三大核心問題:穿透、擊穿、雪崩的本質區別 (一)概念對比表 問題類型核心特征典型場景危害等級緩存穿透數據在緩存和數據庫中均不存在,請求直接穿透到數據庫惡意攻擊(偽造不存在的ID)、業務邏輯漏洞★★★★★緩存擊穿熱點數據在緩存中過期,大量并發請求同時擊穿…

使用Rancher在CentOS 環境上部署和管理多Kubernetes集群

引言 隨著容器技術的迅猛發展,Kubernetes已成為容器編排領域的事實標準。然而,隨著企業應用規模的擴大,多集群管理逐漸成為企業IT架構中的重要需求。 Rancher作為一個開源的企業級多集群Kubernetes管理平臺,以其友好的用戶界面和…

【Mini-F5265-OB開發板試用測評】按鍵控制測試

本文介紹了如何使用按鍵控制 MCU 引腳的輸出電平。 原理 由原理圖可知 板載用戶按鍵 K1 和 K2 分別與主控的 PB0 和 PB1 相連。 代碼 #define _MAIN_C_#include "platform.h" #include "gpio_key_input.h" #include "main.h"int main(void) …

用C#最小二乘法擬合圓形,計算圓心和半徑

用C#最小二乘法擬合圓形&#xff0c;計算圓心和半徑 using System; using System.Collections.Generic;namespace ConsoleApp2 {internal class Program{static void Main(string[] args){List<Tuple<double, double>> points new List<Tuple<double, doubl…

四、web安全-行業術語

1. 肉雞 所謂“肉雞”是一種很形象的比喻&#xff0c;比喻那些可以隨意被我們控制的電腦&#xff0c;對方可以是WINDOWS系統&#xff0c;也可以是UNIX/LINUX系統&#xff0c;可以是普通的個人電腦&#xff0c;也可以是大型的服務器&#xff0c;我們可以象操作自己的電腦那樣來…

MYSQL丟失pid處理方式

1、停止服務器 systemctl stop mysqld 2、修改 /data/mysql/etc/my.cnf pid-file /tmp/mysql/mysql.pid 改為 pid-file /data/mysql/mysql.pid 3、創建 touch /data/mysql/mysql.pid ch…

《計算機組成原理》第 2 章 - 計算機的發展及應用?

計算機從誕生至今&#xff0c;經歷了翻天覆地的變化&#xff0c;應用領域也在不斷拓展。本文將結合 Java 代碼實例&#xff0c;帶你深入了解計算機的發展歷程、應用場景及未來展望&#xff0c;讓你在學習理論的同時&#xff0c;還能通過實踐加深理解。? 2.1 計算機的發展史? …

Github 2025-05-26 開源項目周報Top15

根據Github Trendings的統計,本周(2025-05-26統計)共有15個項目上榜。根據開發語言中項目的數量,匯總情況如下: 開發語言項目數量Python項目5TypeScript項目3JavaScript項目3C++項目2Roff項目1Go項目1C#項目1Jupyter Notebook項目1Rust項目1CSS項目1Shell項目1Dockerfile項目…

詳解MYSQL索引失效問題排查

目錄 一、快速定位索引失效的步驟 1. 使用 EXPLAIN 分析執行計劃詳解Mysql的Explain語句 2. 確認索引是否存在 3. 檢查查詢條件是否符合索引規則 二、常見索引失效場景及解決方法 1. 索引列參與計算或函數 2. 隱式類型轉換 3. 使用 LIKE 以通配符開頭 4. 使用 OR 連接…

在 springboot3.x 使用 knife4j 以及常見報錯匯總

目錄 引言&#xff1a; 引入依賴&#xff1a; 配置文件&#xff1a; 過濾靜態資源&#xff1a; 增強模式&#xff1a; 便捷地址訪問&#xff1a; 常見問題&#xff1a; 注解使用實例&#xff1a; &#x1f4c4; ?文檔參考地址?&#xff1a; SpringBoot 3.x 結合 …

【C/C++】環形緩沖區:高效數據流轉核心

文章目錄 1 核心結構與原理1.1 組成1.2 內存布局1.3 關鍵操作 2 實現細節與優化2.1 滿/空狀態的判斷2.2 多線程安全&#xff08;無鎖實現&#xff09;2.3 性能優化 3 典型應用場景4 代碼示例5 優缺點6 對比7 進階 環形緩沖區&#xff08;Ring Buffer&#xff09;&#xff0c;又…

功耗僅4W!迷你服務器黑豹X2(Panther X2)卡刷、線刷刷入Armbian(ubuntu)系統教程

功耗僅4W&#xff01;迷你服務器黑豹X2&#xff08;Panther X2&#xff09;卡刷、線刷刷入Armbian&#xff08;ubuntu&#xff09;系統教程 前言 前段時間逛海鮮市場的時候留意到一個礦渣盒子&#xff0c;黑豹x2&#xff0c;又是一個類似迅雷賺錢寶這樣的挖礦項目已經gg的定制…

【Elasticsearch】更新操作原理

Elasticsearch 的更新操作&#xff08;如 _update 和 _update_by_query&#xff09;在底層實現上有一些復雜的原理&#xff0c;這些原理涉及到 Elasticsearch 的數據存儲機制、索引機制以及事務日志&#xff08;Translog&#xff09;的使用。以下是 Elasticsearch 更新操作的主…

【C++】紅黑樹的實現

目錄 前言 一、紅黑樹的概念 二、紅黑樹的實現 三、紅黑樹的查找 四、紅黑樹的驗證 五、紅黑樹的刪除 總結 前言 本文講解紅黑樹&#xff0c;主要講解插入部分的實現&#xff0c;建議在理解了AVL樹的旋轉后再來學習紅黑樹&#xff0c;因為紅黑樹也涉及旋轉&#xff0c;并…

IPv4地址的主要配置項介紹

1. IPv4 主要配置項 (1) IP 地址&#xff08;IP Address&#xff09; 作用&#xff1a;唯一標識網絡中的設備&#xff08;如 192.168.1.100&#xff09;。分類&#xff1a; 靜態 IP&#xff1a;手動配置&#xff0c;適用于服務器、打印機等固定設備。動態 IP&#xff08;DHCP…

nginx 基于IP和用戶的訪問

nginx的下載 yum install nginx.x86_64 -y 啟動服務 systemctl enable --now nginx.service 查看服務目錄 [rootwebserver ~]# rpm -ql nginx /usr/bin/nginx-upgrade /usr/lib/systemd/system/nginx.service /usr/share/man/man3/nginx.3pm.gz /usr/share/man/man8/nginx…

Debian操作系統全面解析:從起源到應用

Debian 操作系統全面解析:從起源到應用 在開源操作系統的廣袤天地中,Debian 占據著極為重要的地位。它憑借自身諸多突出特性,吸引了全球無數用戶與開發者的目光,從個人桌面應用到大型服務器部署,從普通辦公場景到專業科研領域,Debian 都展現出了強大的適應性與可靠性,為…

【springMVC】springMVC學習系列一:springMVC的組件

系列文章目錄 前言 spring mvc 它解決了什么問題呢&#xff1f; 1.URL映射 2. 表單參數映射 3. 調用目標Control 4. 數據模型映射 5. 視圖解析 6. 異常處理 上述解決在spring mvc 中都體現在如下組件當中 HandlerMapping&#xff1a; url與控制器的映謝 HandlerAdapter&#…

【Vue Vapor Mode :技術突破與性能優化的可能性】

Vue Vapor Mode &#xff1a;技術突破與性能優化的可能性 前言 作為一名有著Vue 2經驗和Vue 3經驗的開發者&#xff0c;你一定深刻體會過Vue從Options API到Composition API的演進&#xff0c;也感受過Vue 3在性能上相比Vue 2的顯著提升。現在&#xff0c;Vue團隊正在開發一個…