Kotlin Lambda

Kotlin Lambda

在探索Kotlin Lambda之前,我們先回顧下Java中的Lambda表達式,Java 的 Lambda 表達式是 Java 8 引入的一項強大的功能,它使得函數式編程風格的代碼更加簡潔和易于理解。Lambda 表達式允許你以一種更簡潔的方式表示實現接口(尤其是函數式接口)的方法。它的主要作用是簡化代碼、減少冗長的匿名類實現,并使得代碼更加靈活。
先看一段代碼:

Runnable runnable = new Runnable() {@Overridepublic void run() {System.out.println("Hello Java");}
};

等效為:

Runnable runnable = () -> System.out.println("Hello Java");

帶參數的和帶返回值的其實是類似的,只要滿足函數式接口都可以使用lambda表達式簡化代碼,這里就不做過多的介紹了。

Kotlin高階函數

在了解Kotlin Lambda之前,我們要先了解Kotlin的高階函數,高階函數是指滿足以下條件之一的函數:

  • 將函數作為參數傳遞。
  • 返回一個函數作為結果。
//函數作為參數
fun a(b: () -> Int) {b.invoke()
}
//函數作為返回結果
fun c(x: Int): (Int) -> Int {return { number -> number * x }
}fun main() {val multiplier = c(2)println(multiplier(2))
}

函數引用

在Kotlin中可以使用::對函數進行引用,并且還可以直接引用類似于集合中易經定義的函數,可以簡化代碼

//函數引用
fun d(b: (Int) -> Int): Int {return b.invoke(1)
}fun e(parma: Int): Int {return parma
}val f = ::e
val h = d(::e)

注意:::對函數進行引用之后,實則是創建了一個對象,并不是函數本身,定義的函數無法調用invoke方法,而函數對象可以:

val m = f(1)// 等同于f.invoke(1)
val l = (::e)(1) //等同于(::e).invoke(1)

匿名函數

匿名函數(也稱為lambda 函數)是一種沒有名稱的函數。它們通常用于作為函數參數傳遞給其他函數,或者簡化某些操作。Kotlin 提供了兩種主要的匿名函數寫法:Lambda 表達式和匿名函數。

  • Lambda表達式是一種簡潔的匿名函數寫法,常用于高階函數中。
val lambda = { parma: Int -> { parma * parma } }
  • 匿名函數和 Lambda 表達式非常相似,但它們有一些不同的地方,特別是在返回類型和參數類型推斷方面。匿名函數可以顯式地指定返回類型和參數類型,且它允許在函數體內使用 return 語句來返回結果。
val a = fun(parma: Int): String {return parma.toString()
}

注意:lambda不能使用return進行返回操作,而匿名函數可以
在這里插入圖片描述

Kotlin Lambda

在Java中,我們設置函數式接口類型的對象通常使用匿名內部類或者lambda表達式:

private OnClickListener mListener;interface OnClickListener {void onClick(int value);
}public  void setOnClickListener(OnClickListener listener) {this.mListener = listener;
}//匿名內部類
setOnClickListener(new OnClickListener() {@Overridepublic void onClick(int value) {}
});
//lambda
setOnClickListener(value -> {});

在Kotlin中lambda表達式變得更加簡潔和方便

interface Listener {fun onClick(value: Int)
}fun setListener(listener: Listener) {}
//kotlin可以將setListener方法參數傳對象改為高階函數
fun setListener2(onClick: (Int) -> Unit) {}fun test() {//參數接收對象setListener(object : Listener {override fun onClick(value: Int) {println(value)}})//接收一個匿名函數setListener2(fun(value: Int): Unit {println(value)})//匿名函數可以替換為Lambda表達式setListener2({ value -> println(value) })//若接受的函數是參數列表的最后一個參數,可以寫在括號外面setListener2(){ value -> println(value) }//若匿名函數只有一個參數可以省略,kotlin會用it代替它setListener2 { println(it) }
}

最終我們看到了Kotlin Lambda表達式較為簡潔的寫法。kotlin lambda表達式在聲明時已經指定參數類型,因此參數類型可以不寫,而返回值永遠取最后一行代碼的執行結果,因此也不需要指定返回值。Kotlin 匿名函數和Lambda的本質是函數類型的對象,和::是同樣的效果,而Java 8中的Lambda只是一種簡潔的寫法。

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

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

相關文章

C#學習之DataGridView控件

目錄 一、DataGridView控件常用屬性、方法、事件匯總表 1. 常用方法、屬性和事件匯總 二、DataGridView 控件的常用方法調用 1. DataBind() 方法 2. Clear() 方法 3. Refresh() 方法 4. Sort() 方法 5. ClearSelection() 方法 6. BeginEdit() 方法 7. EndEdit() 方法…

本地事務簡介

本地事務簡介 1 事務基本性質 數據庫事務的幾個特性:原子性(Automicity)、一致性(Consistency)、隔離性或獨立性(islation)和持久性(Durability),簡稱ACID。 原子性:一系列的操作,其整體不可拆分,要么同時成功&#…

PyQt組態軟件 拖拽設計界面測試

PyQt組態軟件測試 最近在研究PyQt,嘗試寫個拖拽設計界面的組態軟件,目前實現的功能如下: 支持拖入控件,鼠標拖動控件位置 拖動控件邊緣修改控件大小支持屬性編輯器,修改當前選中控件的屬性 拖動框選控件,點選控件 控…

軟件評測師復習之計算機網絡(4)

目錄 (一)1.網絡功能和分類2.OSI七層模型3.TCP/IP協議4.傳輸介質(二)1.通信方式和交換方式2.IP地址3.IPv64.網絡規劃與設計5.磁盤冗余陣列6.網絡存儲技術(一) 1.網絡功能和分類 計算機網絡功能:數據通信、資源共享、負載均衡、高可靠性 按分布范圍和拓撲結構劃分: 網絡分類…

機器學習-1:線性回歸

常用的線性回歸模型主要有以下這些 簡單線性回歸多元線性回歸多項式回歸嶺回歸套索回歸彈性網絡回歸逐步回歸 一.簡單的一元線性回歸 1.導入必備的庫 #導入必備的庫 import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.model_selection …

SQL SERVER的PARTITION BY應用場景

SQL SERVER的PARTITION BY關鍵字說明介紹 PARTITION BY關鍵字介紹具體使用場景排名計算累計求和分組求最值分組內百分比計算分組內移動平均計算分組內數據分布統計分組內數據偏移計算 總結 PARTITION BY關鍵字介紹 在SQL SERVER中,關鍵字PARTITION BY主要用于窗口函…

NO.18十六屆藍橋杯備戰|循環嵌套|乘法表|斐波那契|質數|水仙花數|(C++)

循環嵌套 循環嵌套的使? while , do while , for ,這三種循環往往會嵌套在?起才能更好的解決問題,就是我們所說的:循環嵌套。這三種循環都可以任意嵌套使? ?如: 寫?個代碼,打印?個乘法?…

leetcode - hot100 - python - 專題一:哈希

1、兩數之和 簡單 題目: 給定一個整數數組 nums 和一個整數目標值 target,請你在該數組中找出 和為目標值 target 的那 兩個 整數,并返回它們的數組下標。你可以假設每種輸入只會對應一個答案,并且你不能使用兩次相同的元素。你可…

JavaEE-SpringBoot快速入門

文章目錄 本節目標Maven什么是Maven創建一個Maven項目maven項目功能maven的依賴管理全球倉庫, 私服, 本地服務器, 配置國內鏡像 第一個SpringBoot項目創建項目運行SpringBoot程序 SpringBoot原理初步Web服務器 總結 本節目標 了解什么是maven, 配置國內源使用Springboot創建項…

【Viper】配置格式與支持的數據源與go案例

Viper 是一個用于 Go 應用程序的配置管理庫,支持多種配置格式和數據源。 安裝依賴 go get github.com/spf13/viper go get github.com/spf13/viper/remote go get go.etcd.io/etcd/client/v3"github.com/spf13/viper/remote"要寫在etcd客戶端import里 1…

【C/C++】后綴表達式 藍橋杯/ACM備賽

核心考點:1.棧的應用 2.字符串處理 題目描述 所謂后綴表達式是指這樣的一個表達式:式中不再引用括號,運算符號放在兩個運算對象之后,所有計算按運算符號出現的順序,嚴格地由左而右新進行(不用考慮運算符的…

【AI實踐】deepseek支持升級git

當前Windows 11 WSL的git是2.17,Android Studio提示需要升級到2.19版本 網上找到指導文章 安裝git 2.19.2 cd /usr/src wget https://www.kernel.org/pub/software/scm/git/git-2.19.2.tar.gz tar xzf git-2.19.2.tar.gz cd git-2.19.2 make prefix/usr/l…

QEMU 搭建 Ubuntu x86 虛擬機

1. 安裝 QEMU 在 Ubuntu 系統中,可以通過以下命令安裝 QEMU: sudo apt-get update sudo apt-get install qemu-system-x86_64 qemu-kvm libvirt-daemon libvirt-clients bridge-utils virt-manager2. 創建虛擬硬盤鏡像 qemu-img create -f raw ubuntu…

Linux驅動層學習:Linux 設備樹

設備樹是一種數據結構,包含多個節點,用于描述硬件設備及其配置信息,它通常用于嵌入式系統中,尤其是在Linux操作系統中,幫助操作系統識別和管理硬件資源,設備樹不是代碼,而是一種用數據描述硬件信…

金蝶云星空與釘釘高效數據集成案例分享

金蝶云星空數據集成到釘釘的技術案例分享 在企業信息化系統中,數據的高效流動和實時反饋是提升業務效率的關鍵。本文將聚焦于一個具體的系統對接集成案例:如何將金蝶云星空的數據集成到釘釘,并實現審核狀態的回傳提示。 本次集成方案名為“…

圖形渲染(一)——Skia、OpenGL、Mesa 和 Vulkan簡介

1.Skia —— 2D 圖形庫 Skia 是一個 2D 圖形庫,它的作用是為開發者提供一個高層次的繪圖接口,方便他們進行 2D 圖形渲染(比如繪制文本、形狀、圖像等)。Skia 本身不直接管理 GPU 或進行底層的渲染工作,而是通過 底層圖…

GIT提錯分支,回滾提交

1. 準備示例 假設我們有三次提交: test1:需要在 master 分支提交test2、test3:需要在 develop 分支提交 遠端線上記錄 2. 步驟 選擇需要回退的記錄: 選中需要回退的 commit,選擇 Reset Current Branch to Here...。…

【原創】在ubuntu中搭建gradle開發環境

檢查Linux版本 rootwww:~# hostnamectlStatic hostname: www.0x88.comIcon name: computer-vmChassis: vmMachine ID: 30fa955a36be492ca459599ef20bc508Boot ID: 37084dbe36f44adaa075e8f9a98f132eVirtualization: kvm Operating System: Ubuntu 22.04.5 LTSKernel: Linux 5.…

【JavaEE進階】MyBatis入門

目錄 🌴前言 🌲什么是MyBatis? 🌳準備工作 🚩創建工程 🚩配置數據庫連接字符串 🚩數據準備 🚩編寫持久層代碼 🍃單元測試 🌴前言 在應?分層學習時,我們了解到…

以太網詳解(八)傳輸層協議:TCP/UDP 協議

文章目錄 傳輸層協議概述為什么需要傳輸層?傳輸層功能網絡層與傳輸層在實現 “端到端” 傳輸的異同兩類服務:面向連接/無連接服務 傳輸控制協議 TCPTCP 協議數據單元格式TCP 的重傳機制快重傳和快恢復快重傳舉例快恢復算法 用戶數據報協議 UDPUDP 概述UDP 基本工作過…