Kotlin 標準函數 with、run、apply 的定義和使用

Kotlin 標準函數?withrunapply?的定義和使用

1.?with?函數

定義

with?函數允許你在一個對象的上下文中執行一個 lambda 表達式,而不需要在 lambda 表達式中重復引用該對象。

@kotlin.internal.InlineOnly
public inline fun <T, R> with(receiver: T, block: T.() -> R): R = receiver.block()

使用場景

當你需要在多個地方引用同一個對象,并且不想每次都顯式地寫出這個對象名時,可以使用?with?函數。

示例

val stringBuilder = StringBuilder()
with(stringBuilder) {
append("Hello")
append(", ")
append("World!")
}
println(stringBuilder) // 輸出 "Hello, World!"
2.?run?函數

定義

run?是 Kotlin 中所有類的成員函數,用于在當前對象的上下文中執行一個 lambda 表達式,但不返回任何值(返回?Unit)。

雖然這不是顯式定義的函數,但它是通過擴展函數為所有類隱式提供的。

使用場景

當你需要在對象的上下文中執行一些操作,但不需要返回任何結果時,可以使用?run

示例(雖然不常見,因為可以直接在對象上調用方法):

val stringBuilder = StringBuilder()
stringBuilder.run {
append("Hello")
append(", ")
append("World!")
}
println(stringBuilder) // 輸出 "Hello, World!"
3.?apply?函數

定義

apply?是 Kotlin 的一個擴展函數,它執行給定的 lambda 表達式,并返回調用它的對象本身。

public inline fun <T> T.apply(block: T.() -> Unit): T { block(); return this }

使用場景

當你需要在對象的上下文中執行一些操作,并希望返回該對象以便進行鏈式調用時,可以使用?apply

示例

 
val stringBuilder = StringBuilder().apply {
append("Hello")
append(", ")
append("World!")
}
println(stringBuilder) // 輸出 "Hello, World!"
區別
  • with:接受一個對象和一個 lambda 表達式,在 lambda 表達式中可以直接調用該對象的方法,無需前綴。返回 lambda 表達式的返回值。
  • run:是類的成員函數,接受一個 lambda 表達式,在 lambda 表達式中可以直接調用該對象的方法。返回?Unit
  • apply:是擴展函數,接受一個 lambda 表達式,在 lambda 表達式中可以直接調用該對象的方法。返回調用它的對象本身。

定義靜態方法

在 Kotlin 中,沒有直接的“靜態方法”概念,但你可以通過以下幾種方式實現類似的功能:

  1. 頂層函數:在文件的頂層定義的函數可以在沒有類實例的情況下調用。
 
// MyUtils.kt
fun staticLikeFunction() {
// ...
}
// 在其他文件中
MyUtilsKt.staticLikeFunction() // 注意:Kotlin 會為頂層函數生成一個包含文件名的類(除非你用 @file:JvmName 指定一個名稱)
  1. 對象表達式或對象聲明:你可以創建一個單例對象,并在其中定義函數。
object MyUtils {
@JvmStatic // 如果你希望這個函數在 Java 中看起來像靜態的
fun staticLikeFunction() {
// ...
}
}
// 調用
MyUtils.staticLikeFunction()

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

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

相關文章

云計算期末復習(1)

云計算基礎 作業&#xff08;問答題&#xff09; &#xff08;1&#xff09;總結云計算的特點。 透明的云端計算服務 “無限”多的計算資源&#xff0c;提供強大的計算能力 按需分配&#xff0c;彈性伸縮&#xff0c;取用方便&#xff0c;成本低廉資源共享&#xff0c;降低企…

python 3.10 install on centos

CentOS 7 安裝 Python 3.10_yum python3.10-CSDN博客

Homebrew安裝mysql之后,啟動和使用MySQL服務:

啟動MySQL服務&#xff1a; brew services start mysql 手動啟動服務&#xff1a; mysql.server start 例如&#xff1a; mysql.server start Starting MySQL .. SUCCESS! 停止 MySQL服務&#xff1a; brew services stop mysql 或者 mysql.server stop 重啟MySQL服務&a…

IDEA使用Maven打包項目的所有的依賴

要使用 Maven 命令將 Spring Boot 項目的依賴打包到 lib 文件夾中&#xff0c;你可以在終端中運行以下命令&#xff1a; mvn dependency:copy-dependencies -DoutputDirectory./lib這個命令會將項目的所有依賴&#xff08;包括運行時依賴&#xff09;復制到當前目錄的 lib 文件…

Windows操作系統基本知識整理

目錄 引言 一、Windows操作系統的發展歷史 1.1 Windows 1.0到Windows 3.0 1.2 Windows 95到Windows Me 1.3 Windows NT到Windows 2000 1.4 Windows XP到Windows 7 1.5 Windows 8到Windows 10 二、Windows操作系統的核心組件 2.1 內核 2.2 文件系統 2.3 圖形用戶界面&…

內網橫向移動小補充 --->PTK

大家別急&#xff0c;我的基于資源的約束性委派攻擊還在寫&#xff0c;這個東西一時半會講不清楚&#xff0c;所以我在這里先來補充一點橫向移動以前沒說好的東西&#xff01;&#xff01;&#xff01; 在更啦&#xff0c;別催啦~~~~ 還記得我之前在內網滲透里面講過這個PTK&a…

亞馬遜云主管馬特·加爾曼面臨壓力,致力于在人工智能領域趕超競爭對手

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎&#xff1f;訂閱我們的簡報&#xff0c;深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同&#xff0c;從行業內部的深度分析和實用指南中受益。不要錯過這個機會&#xff0c;成為AI領…

mysql中連接查詢的成本

大家好。上篇文章我們講了mysql中成本的含義以及單表查詢如何計算成本。現在我們接著講講mysql中連接查詢的成本。 在講之前&#xff0c;我們先創建兩張一樣的表single_table和single_table2&#xff0c;并在表中插入10000條數據。在下面的講解中&#xff0c;我們稱single_tab…

java并發工具類都有哪些

Java中的并發工具類包括&#xff1a; CountDownLatch CountDownLatch允許一個或多個線程等待其他線程完成某些操作。它通常用于線程間的同步&#xff0c;例如在一個線程完成其工作后通知其他線程繼續執行。 CyclicBarrier CyclicBarrier是一個同步輔助類&#xff0c;它允許一…

使用@Transactional 注解下,事務失效的場景

前言 Transactional是一種基于注解管理事務的方式&#xff0c;spring通過動態代理的方式為目標方法實現事務管理的增強。 Transactional使用起來方便&#xff0c;但也需要注意引起Transactional失效的場景&#xff0c;本文總結了七種情況&#xff0c;下面進行逐一分析。 一、…

【面試必看】Java并發

并發 1. 線程 1. 線程vs進程 進程是程序的一次執行過程&#xff0c;是系統運行程序的基本單位&#xff0c;因此進程是動態的。 系統運行一個程序即是一個進程從創建&#xff0c;運行到消亡的過程。在 Java 中&#xff0c;當我們啟動 main 函數時其實就是啟動了一個 JVM 的進…

ChaosMeta V0.7.0 版本發布 進入CNCF混沌工程全景圖

混沌工程 ChaosMeta 的全新版本 V0.7.0 現已正式發布&#xff01;該版本包含了許多新特性和增強功能&#xff0c;在編排界面提供了多集群管理&#xff0c;在代碼層面支持多命令下發通道的選擇。另外由螞蟻集團發起的ChaosMeta于北京時間2024年1月10日正式進入CNCF混沌工程全景圖…

20232906 2023-2024-2 《網絡與系統攻防技術》第十一次作業

20232906 2023-2024-2 《網絡與系統攻防技術》第十一次作業 1.實驗內容 一、web瀏覽器滲透攻擊 任務&#xff1a;使用攻擊機和Windows靶機進行瀏覽器滲透攻擊實驗&#xff0c;體驗網頁木馬構造及實施瀏覽器攻擊的實際過程。 二、取證分析實踐—網頁木馬攻擊場景分析 ①首先你…

07_Servlet

Servlet 一 Servlet簡介 1.1 動態資源和靜態資源 靜態資源 無需在程序運行時通過代碼運行生成的資源,在程序運行之前就寫好的資源. 例如:html css js img ,音頻文件和視頻文件 動態資源 需要在程序運行時通過代碼運行生成的資源,在程序運行之前無法確定的數據,運行時動態生成…

轉行一年了

關注、星標公眾號&#xff0c;直達精彩內容 ID&#xff1a;技術讓夢想更偉大 整理&#xff1a;李肖遙 來公司一年了。 說是轉行其實還是在半導體行業&#xff0c;熟悉我的朋友知道 &#xff0c;我在18年開始進入半導體行業&#xff0c;那個時候想著行業很重要&#xff0c;站對了…

【前端三劍客之JS】詳解JS

1. JS的引入方式 (1). 內部腳本方式引入 在頁面上&#xff0c;通過一對script標簽引入js代碼.script代碼放置位置有一定隨意性&#xff0c;一般放在head標簽中. (2).外部腳本方式引入. 內部腳本只能在當前頁面中使用&#xff0c;代碼復用度不高.可以將腳本放在單獨的js文件…

HG/T 6088-2022 透水道路用涂料檢測

透水混凝土是指由水泥、礦物摻合料、骨料、外加劑及水等主要材料經拌合形成的&#xff0c;具有透水功能的混凝土材料&#xff0c;用于其表面的涂料稱為透水道路用涂料。 HG/T 6088-2022透水道路用涂料檢測項目&#xff1a; 測試指標 測試方法 有害物質限量 GB 38468 在容器…

io.net 是什么,DePIN(去中心化物理基礎設施網絡)

目錄 io.net 是什么 io.net去中心化原理 DePIN(去中心化物理基礎設施網絡)

氣泡水位計的安裝方法詳解(二)

氣泡水位計的安裝方法詳解&#xff08;二&#xff09; 產品簡介 氣泡式水位計ZL-BWL-013是一款適用于水文、水利信息化建設領域的新一代水位測量類設備&#xff0c;產品執行GB/T 11828.2-2022標準。ZL-BWL-013氣泡水位計&#xff0c;具有安裝方便、易于操作&#xff0c;高精度…

算法刷題day54:搜索(一)

目錄 引言一、池塘計數二、城堡問題三、山峰和山谷四、迷宮問題五、武士風度的牛六、抓住那頭牛七、矩陣距離八、魔板 引言 針對于藍橋杯&#xff0c;搜索問題還是非常之重要的&#xff0c;在省賽前深知暴搜的重要性&#xff0c;所以提前先把提高課的搜索一章給看了&#xff0…