Kotlin 作用域函數(let、run、with、apply、also)對比

Kotlin 的 作用域函數(Scope Functions) 是簡化代碼邏輯的重要工具,它們通過臨時作用域為對象提供更簡潔的操作方式。以下是 letrunwithapplyalso 的對比分析:


一、核心區別對比表

函數上下文對象引用返回值是否擴展函數典型使用場景
letitLambda 結果非空對象處理、鏈式操作
runthisLambda 結果對象配置 + 結果計算
withthisLambda 結果對象的多屬性操作
applythis對象本身對象初始化配置
alsoit對象本身對象附加操作(如日志、驗證)

二、詳細對比與使用場景

1. let
val result = obj.let { // 操作 it 對象,返回最后一行結果it.doSomething()"Result" 
}
  • 特點
    • 通過 it 引用上下文對象,避免與外部作用域的 this 沖突。
    • 處理可空對象:配合 ?. 安全調用(obj?.let { ... })。
    • 鏈式操作:將對象轉換為其他結果。
2. run
val result = obj.run { // 直接訪問 this(可省略),返回最后一行結果doSomething()"Result"
}
  • 特點
    • 結合了 with 的作用域和 let 的擴展函數特性。
    • 同時操作對象屬性并返回結果:適合對象配置后立即計算結果的場景。
3. with
val result = with(obj) {// 直接訪問 this(可省略),返回最后一行結果doSomething()"Result"
}
  • 特點
    • 非擴展函數,直接傳入對象。
    • 批量操作對象屬性:例如初始化對象或對對象進行多次修改。
4. apply
val obj = MyClass().apply { // 直接訪問 this(可省略),返回對象本身name = "Kotlin"age = 10
}
  • 特點
    • 返回對象本身,適合對象初始化或鏈式配置。
    • 類似建造者模式(Builder Pattern)。
5. also
val obj = MyClass().also { // 通過 it 引用對象,返回對象本身println("Created: $it")
}
  • 特點
    • 執行副作用操作:如打印日志、驗證數據,但不修改對象。
    • 鏈式調用中插入額外操作。

三、選擇依據

  1. 是否需要返回對象本身?

    • 是 → applyalso
    • 否 → letrunwith
  2. 上下文對象引用方式

    • 需要顯式名稱(避免 this 沖突) → letalso(使用 it)。
    • 隱式訪問屬性 → runwithapply(使用 this)。
  3. 處理可空性

    • 使用 ?.let 安全處理可空對象。
  4. 是否需要擴展函數?

    • 是 → 排除 with

四、經典示例

// let:處理可空對象 + 轉換結果
val length = nullableString?.let { it.trim().length 
} ?: 0// apply:對象初始化
val person = Person().apply {name = "Alice"age = 30
}// also:鏈式調用插入日志
val list = mutableListOf(1, 2, 3).also { println("Initial list: $it") }.apply { add(4) }.also { println("Updated list: $it") }

通過理解上下文引用方式、返回值和典型場景,可以更精準地選擇合適的作用域函數,提升代碼簡潔性和可讀性。

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

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

相關文章

14、Python時間表示:Unix時間戳、毫秒微秒精度與time模塊實戰

適合人群:零基礎自學者 | 編程小白快速入門 閱讀時長:約5分鐘 文章目錄 一、問題:計算機中的時間的表示、Unix時間點?1、例子1:計算機的“生日”:Unix時間點2、答案:(1)U…

AI日報 - 2024年5月17日

🌟 今日概覽 (60秒速覽) ▎🤖 大模型前沿 | OpenAI推出自主編碼代理Codex;Google DeepMind發布Gemini驅動的編碼代理AlphaEvolve,能設計先進算法;Meta旗艦AI模型Llama 4 Behemoth發布推遲。 Codex能并行處理多任務&…

DriveMM:用于自動駕駛的一體化大型多模態模型——論文閱讀

《DriveMM: All-in-One Large Multimodal Model for Autonomous Driving》2024年12月發表,來自中山大學深圳分校和美團的論文。 大型多模態模型(LMM)通過整合大型語言模型,在自動駕駛(AD)中表現出卓越的理解…

C++_STL_map與set

1. 關聯式容器 在初階階段,我們已經接觸過STL中的部分容器,比如:vector、list、deque、 forward_list(C11)等,這些容器統稱為序列式容器,因為其底層為線性序列的數據結構,里面 存儲的是元素本身。那什么是…

【嵌入式開發-RGB 全彩 LED】

嵌入式開發-RGB 全彩 LED ■ RGB 全彩 LED簡介■ 電路設計■ ■ RGB 全彩 LED簡介 RGB 全彩 LED 模塊顯示不同的顏色。 ■ 電路設計 全彩 LED 使用 PA5、 藍色(B) TIM2_CHN3 PA1、 綠色(G)TIM2_CHN2 PA2、 紅色(R&am…

計算機網絡:手機和基站之間的通信原理是什么?

手機與基站之間的通信是無線通信技術的核心應用之一,涉及復雜的物理層傳輸、協議交互和網絡管理機制。以下從技術原理、通信流程和關鍵技術三個層面深入解析這一過程: 一、蜂窩網絡基礎架構 1. 蜂窩結構設計 基本原理:將服務區域劃分為多個六邊形“蜂窩小區”,每個小區由*…

【Docker】Docker安裝RabbitMQ

目錄 1.拉取鏡像 2. 創建掛載目錄 3.創建和啟動 4.登錄管理端 1.拉取鏡像 推薦使用帶 Web 管理界面的官方鏡像(management) # 拉取docker鏡像 docker pull rabbitmq:management響應內容: 2. 創建掛載目錄 創建掛載目錄和日志目錄 #rabb…

交叉編譯源碼的方式移植ffmpeg-rockchip

獲取ffmpeg源碼 git submodule add -f https://github.com/FFmpeg/FFmpeg.git thirdparty/FFmpeg 瑞芯微ffmpeg-rk git clone https://github.com/jjm2473/ffmpeg-rk/tree/enc# 參考的一位博主的說法 使用 ffmpeg-rochip 的好處 傳統的使用硬件編解碼的開發思路是&#xf…

9.0 C# 調用solidworks介紹1

一、C# 與 SolidWorks 聯合開發概述 SolidWorks 提供了完整的 API(應用程序接口),允許開發者使用 C# 等編程語言進行二次開發,實現自動化設計、定制功能等。 主要技術要點包括: 1. API 結構:SolidWorks API 是基于 COM 的接口,包含數百個對象和數千個方法…

AD 多層線路及裝配圖PDF的輸出

裝配圖的輸出: 1.點開‘智能PDF’ 2. 設置顯示頂層: 設置顯示底層: 多層線路的輸出 同樣使用‘智能PDF’

SpringBoot + Shiro + JWT 實現認證與授權完整方案實現

SpringBoot Shiro JWT 實現認證與授權完整方案 下面博主將詳細介紹如何使用 SpringBoot 整合 Shiro 和 JWT 實現安全的認證授權系統,包含核心代碼實現和最佳實踐。 一、技術棧組成 技術組件- 作用版本要求SpringBoot基礎框架2.7.xApache Shiro認證和授權核心1.…

PCIe數據采集系統詳解

PCIe數據采集系統詳解 在上篇文章中,廢了老大勁兒我們寫出了PCIe數據采集系統;其中各個模塊各司其職,相互配合。完成了從數據采集到高速存儲到DDR3的全過程。今天我們呢就來詳細講解他們之間的關系?以及各個模塊的關鍵點&#xff…

2025云智算技術白皮書

1. 云智算的演進背景 傳統云計算面臨三大挑戰: 算力需求激增:AI大模型訓練需十萬卡級GPU集群,資源調度能力不足。網絡性能瓶頸:TB級參數同步對低時延、高吞吐要求遠超傳統網絡架構。服務形態單一:IaaS/PaaS無法覆蓋A…

C語言編程中的時間處理

最簡單的time 在C語言編程中&#xff0c;處理時間最簡單的函數就是time了。它的原型為&#xff1a; #include <time.h> time_t time(time_t *_Nullable tloc);返回自從EPOCH&#xff0c;即1970年1月1日的零點零時零分&#xff0c;到當前的秒數。 輸入參數可以是NULL。…

適應性神經樹:當深度學習遇上決策樹的“生長法則”

1st author: Ryutaro Tanno video: Video from London ML meetup paper: Adaptive Neural Trees ICML 2019 code: rtanno21609/AdaptiveNeuralTrees: Adaptive Neural Trees 背景 在機器學習領域&#xff0c;神經網絡&#xff08;NNs&#xff09;憑借其強大的表示學習能力&…

InitVerse節點部署教程

項目介紹: InitVerse 是一個為新興企業量身定制的自動化 Web3 SaaS 平臺,只需單擊幾下即可快速開發和部署 DApp。在 INIChain 和 INICloud 的支持下,InitVerse 可以根據需求動態調整計算資源,實現高效的任務處理,同時提供更高的安全性、可用性和可擴展性。 系統要求: C…

阿里開源通義萬相 Wan2.1-VACE,開啟視頻創作新時代

0.前言 阿里巴巴于2025年5月14日正式開源了其最新的AI視頻生成與編輯模型——通義萬相Wan2.1-VACE。這一模型是業界功能最全面的視頻生成與編輯工具&#xff0c;能夠同時支持多種視頻生成和編輯任務&#xff0c;包括文生視頻、圖像參考視頻生成、視頻重繪、局部編輯、背景延展…

解決“VMware另一個程序已鎖定文件的一部分,進程無法訪問“

問題描述 打開VMware里的虛擬機時&#xff0c;彈出"另一個程序已鎖定文件的一部分&#xff0c;進程無法訪問"如圖所示&#xff1a; 這是VM虛擬機的保護機制。虛擬機運行時&#xff0c;為防止數據被篡改&#xff0c;會將所運行的文件保護起來。當虛擬機崩潰或者強制…

基于大數據的租房信息可視化系統的設計與實現【源碼+文檔+部署】

課題名稱 基于大數據的租房信息可視化系統的設計與實現 學 院 專 業 計算機科學與技術 學生姓名 指導教師 一、課題來源及意義 租房市場一直是社會關注的熱點問題。隨著城市化進程的加速&#xff0c;大量人口涌入城市&#xff0c;導致租房需求激增。傳統的租…

Vue3封裝公共圖片組件

對圖片加載做的處理: 圖片加載狀態響應式管理圖片訪問錯誤的處理機制圖片懶加載可通過slot支持自定義加載動畫其他監聽事件的處理及向上傳遞 …<!-- components/CustomImage.vue --> <template><div class="custom-image-wrapper"><!-- 主圖 -…