kotlin高級用法總結

Kotlin 是一門功能強大且靈活的編程語言,除了基礎語法外,它還提供了許多高級特性,可以幫助你編寫更簡潔、高效和可維護的代碼。以下是 Kotlin 的一些高級用法,涵蓋了協程、擴展函數、屬性委托、內聯類、反射等內容。

  1. 協程(Coroutines)
    協程是 Kotlin 中用于簡化異步編程的核心特性。它允許你以同步的方式編寫異步代碼,避免回調地獄。

1.1 基本用法

import kotlinx.coroutines.*fun main() = runBlocking {launch {delay(1000) // 非阻塞延遲println("World!")}println("Hello,")
}

runBlocking:阻塞當前線程,直到協程執行完畢。

launch:啟動一個新的協程。

1.2 異步返回值
使用 async 和 await 獲取異步結果:

fun main() = runBlocking {val result = async {delay(1000)"Hello, World!"}println(result.await()) // 輸出:Hello, World!
}

1.3 結構化并發
通過 CoroutineScope 管理協程的生命周期:

fun main() = runBlocking {val scope = CoroutineScope(Dispatchers.Default)scope.launch {delay(1000)println("Task completed")}delay(500) // 等待一段時間scope.cancel() // 取消協程
}
  1. 擴展函數(Extension Functions)
    擴展函數允許你為現有類添加新方法,而無需修改其源代碼。

2.1 基本用法

fun String.isPalindrome(): Boolean {return this == this.reversed()
}fun main() {println("racecar".isPalindrome()) // 輸出:true
}

2.2 擴展屬性

val String.lastChar: Charget() = this[length - 1]fun main() {println("Kotlin".lastChar) // 輸出:n
}
  1. 屬性委托(Property Delegation)
    屬性委托允許你將屬性的 getter 和 setter 邏輯委托給另一個對象。

3.1 使用 lazy 實現懶加載

val lazyValue: String by lazy {println("計算值")"Hello"
}fun main() {println(lazyValue) // 第一次訪問時計算println(lazyValue) // 直接使用緩存值
}

3.2 使用 Delegates.observable 監聽屬性變化

import kotlin.properties.Delegatesvar observedValue: String by Delegates.observable("初始值") { _, old, new ->println("值從 $old 變為 $new")
}fun main() {observedValue = "新值" // 輸出:值從 初始值 變為 新值
}
  1. 內聯類(Inline Classes)
    內聯類用于封裝一個值,同時避免運行時開銷。

4.1 基本用法

inline class Password(val value: String)fun main() {val password = Password("123456")println(password.value) // 輸出:123456
}

4.2 優化性能
內聯類在運行時會被替換為原始值,避免額外的對象分配。

  1. 反射(Reflection)
    反射允許你在運行時檢查類和對象的屬性和方法。

5.1 獲取類的信息

import kotlin.reflect.full.memberPropertiesdata class User(val name: String, val age: Int)fun main() {val user = User("Alice", 25)val properties = User::class.memberPropertiesfor (property in properties) {println("${property.name} = ${property.get(user)}")}
}

5.2 動態調用方法

import kotlin.reflect.full.functionsclass Calculator {fun add(a: Int, b: Int): Int = a + b
}fun main() {val calculator = Calculator()val addFunction = Calculator::class.functions.find { it.name == "add" }!!val result = addFunction.call(calculator, 2, 3) as Intprintln(result) // 輸出:5
}
  1. 高階函數與 Lambda 表達式
    高階函數是指以函數作為參數或返回值的函數。

6.1 基本用法

fun operateOnNumbers(a: Int, b: Int, operation: (Int, Int) -> Int): Int {return operation(a, b)
}fun main() {val sum = operateOnNumbers(2, 3) { x, y -> x + y }println(sum) // 輸出:5
}

6.2 內聯函數
使用 inline 關鍵字避免 Lambda 表達式的運行時開銷:

inline fun measureTime(block: () -> Unit) {val start = System.currentTimeMillis()block()val end = System.currentTimeMillis()println("耗時:${end - start} 毫秒")
}fun main() {measureTime {Thread.sleep(1000)}
}
  1. 密封類(Sealed Classes)
    密封類用于表示受限的類層次結構,子類必須在同一文件中定義。

7.1 基本用法

sealed class Result
data class Success(val data: String) : Result()
data class Error(val message: String) : Result()fun handleResult(result: Result) {when (result) {is Success -> println("成功:${result.data}")is Error -> println("錯誤:${result.message}")}
}fun main() {val result = Success("數據加載成功")handleResult(result) // 輸出:成功:數據加載成功
}
  1. 泛型與型變
    8.1 泛型類
class Box<T>(val value: T)fun main() {val box = Box(42)println(box.value) // 輸出:42
}

8.2 型變(Variance)
協變(out):允許子類型替換父類型。

class Producer<out T>(val value: T)

逆變(in):允許父類型替換子類型。

class Consumer<in T> {fun consume(value: T) {println(value)}
}
  1. DSL(領域特定語言)
    Kotlin 的 DSL 功能允許你創建領域特定語言,使代碼更具表現力。

9.1 構建 HTML DSL

class HTML {fun body(block: Body.() -> Unit) {val body = Body()body.block()println(body)}
}class Body {var content: String = ""fun p(block: () -> String) {content += "<p>${block()}</p>"}
}fun html(block: HTML.() -> Unit): HTML {val html = HTML()html.block()return html
}fun main() {html {body {p { "Hello, World!" }}}
}
  1. 總結
    Kotlin 的高級特性包括:

協程:簡化異步編程。

擴展函數和屬性:增強現有類的功能。

屬性委托:簡化屬性邏輯。

內聯類:優化性能。

反射:動態操作類和對象。

高階函數與 Lambda:支持函數式編程。

密封類:受限的類層次結構。

泛型與型變:增強類型安全性。

DSL:創建領域特定語言。

掌握這些高級用法,可以讓你在 Kotlin 中編寫更高效、靈活和可維護的代碼!

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

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

相關文章

Linux網絡 NAT、代理服務、內網穿透

NAT 技術 IPv4 協議中存在 IP 地址數量不充足的問題&#xff0c;而 NAT 技術是當前解決 IP 地址不夠用的主要手段 , 是路由器的一個重要功能。NAT 能夠將私有 IP 對外通信時轉為全局 IP&#xff0c;也就是就是一種將私有 IP 和全局 IP 相互轉化的技術方法。 這可以讓很多學…

世界模型在塑造自動駕駛中的作用:綜述

25年2月來自華中理工和百度的論文“”The Role of World Models in Shaping Autonomous Driving: A Comprehensive Survey“。 駕駛世界模型 (DWM) 專注于預測駕駛過程中的場景演變&#xff0c;已成為實現自動駕駛一個有前途的范例。這些方法使自動駕駛系統能夠更好地感知、理…

全向廣播揚聲器在油氣田中的關鍵應用 全方位守護安全

油氣田作為高風險作業場所&#xff0c;安全生產始終是重中之重。在緊急情況下&#xff0c;如何快速、有效地傳達信息&#xff0c;確保人員安全撤離&#xff0c;是油氣田安全管理的關鍵環節。全向廣播揚聲器憑借其全方位覆蓋、高音質輸出和強大的環境適應性&#xff0c;成為油氣…

【AI大模型】AI賦能,使用DeepSeek 高效制作PPT實戰詳解

目錄 一、前言 二、傳統 PPT 制作問題 2.1 傳統方式制作 PPT 2.2 AI 大模型輔助制作 PPT 2.3 適用場景對比分析 2.4 最佳實踐與推薦 三、DeepSeek Kimi 高效制作PPT操作實踐 3.1 Kimi 簡介 3.2 DeepSeek Kimi 制作PPT優勢 3.2.1 DeepSeek 優勢 3.2.2 Kimi 制作PPT優…

【51單片機】程序實驗13.串口通信

主要參考學習資料&#xff1a;B站【普中官方】51單片機手把手教學視頻 開發資料下載鏈接&#xff1a;http://www.prechin.cn/gongsixinwen/208.html 前置知識&#xff1a;C語言 單片機套裝&#xff1a;普中STC51單片機開發板A4標準版套餐7 目錄 通信的基本概念串行通信與并行通…

論文閱讀筆記:ArcFace: Additive Angular Margin Loss for Deep Face Recognition

論文閱讀筆記&#xff1a;ArcFace: Additive Angular Margin Loss for Deep Face Recognition 1 背景2 創新點3 方法4 模塊4.1 Softmax4.2 權重歸一化4.3 乘性角度間隔4.4 特征歸一化4.5 加性余弦間隔4.6 加性角度間隔4.7 二值化情況下的比較4.8 目標Logit分析 5 效果5.1 消融實…

代碼隨想錄算法訓練營 | 圖論 | DFS

98. 所有可達路徑// DFS #include <bits/stdc.h> using namespace std;vector<vector<int>> result; vector<int> path;void dfs(const vector<list<int>> &graph, int i, int target) {if (i target) {result.push_back(path);retu…

GPPT: Graph Pre-training and Prompt Tuning to Generalize Graph Neural Networks

GPPT: Graph Pre-training and Prompt Tuning to Generalize Graph Neural Networks KDD22 推薦指數&#xff1a;#paper/??#? 動機 本文探討了圖神經網絡&#xff08;GNN&#xff09;在遷移學習中“預訓練-微調”框架的局限性及改進方向。現有方法通過預訓練&#xff08…

迷你世界腳本方塊接口:Block

方塊接口&#xff1a;Block 彼得兔 更新時間: 2024-08-27 11:04:56 具體函數名及描述如下&#xff1a; 序號 函數名 函數描述 1 isSolidBlock(...) 是否是固體方塊 2 isLiquidBlock(...) 是否是液體方塊 3 isAirBlock(...) 是否是氣體方塊 4 getBl…

Windows下git疑難:有文件無法被跟蹤

Windows下git疑難&#xff1a;有文件無法被跟蹤 最近在寫一個c# WinFrom程序&#xff0c; 奇怪的是&#xff0c;frmMain.cs這個文件一直無法被跟蹤 研究了很久&#xff0c; 參考這一篇 https://blog.csdn.net/m0_37315653/article/details/83064810 git rm --cached ./ -r 之…

Live2d官方項目運行

Live2d官方項目運行 1-參考網址 教程網址&#xff1a;https://blog.csdn.net/qq_39123467/article/details/131735085live2d官方地址&#xff1a;https://live2d.com/cubism-sdk/download/ 2-上手實踐 1&#xff09;先打開官方項目-全部路徑打開2&#xff09;cd /CubismSdkFo…

BUU43 [BJDCTF2020]The mystery of ip 1

前置知識&#xff1a; X - Forwarded - For注入 X - Forwarded - For&#xff08;XFF&#xff09;是一個 HTTP 頭字段&#xff0c;用于記錄客戶端的真實 IP 地址。當客戶端請求經過代理服務器時&#xff0c;代理服務器會將客戶端的 IP 地址添加到 X - Forwarded - For 頭中。…

張岳教授:語言模型推理與泛化研究 | ICLR 2025 特邀報告與團隊專場

點擊藍字 關注我們 AI TIME歡迎每一位AI愛好者的加入&#xff01; AITIME 01 ICLR 2025預講會特邀報告 AITIME 02 ICLR 2025預講會西湖大學張岳老師實驗室專場 01 AI生成文本的自動化檢測 Glimpse: Enabling White-Box Methods to Use Proprietary Models for Zero-Shot LLM-Ge…

MySQL SQL 優化專題

MySQL SQL 優化專題 1. 插入數據優化 -- 普通插入&#xff08;不推薦&#xff09; INSERT INTO tb_user VALUES(1,tom); INSERT INTO tb_user VALUES(2,cat); INSERT INTO tb_user VALUES(3,jerry);-- 優化方案1&#xff1a;批量插入&#xff08;推薦&#xff0c;不建議超過1…

【AI深度學習基礎】NumPy完全指南進階篇:核心功能與工程實踐(含完整代碼)

NumPy系列文章 入門篇進階篇終極篇 一、引言 在掌握NumPy基礎操作后&#xff0c;開發者常面臨真實工程場景中的三大挑戰&#xff1a;如何優雅地處理高維數據交互&#xff1f;如何在大規模計算中實現內存與性能的平衡&#xff1f;怎樣與深度學習框架實現高效協同&#xff1f;…

Python學習第十八天之深度學習之Tensorboard

Tensorboard 1.TensorBoard詳解2.安裝3.使用4.圖像數據格式的一些理解 后續會陸續在詞博客上更新Tensorboard相關知識 1.TensorBoard詳解 TensorBoard是一個可視化的模塊&#xff0c;該模塊功能強大&#xff0c;可用于深度學習網絡模型訓練查看模型結構和訓練效果&#xff08;…

【GraphQL API 漏洞簡介】

GraphQL API 漏洞簡介 一、漏洞原理與分類二、漏洞檢測方法三、典型利用方式四、工具推薦防御建議 GraphQL API 因其靈活性和高效性被廣泛應用&#xff0c;但也因設計和實現缺陷存在多種安全風險。以下從漏洞原理、檢測方法及利用方式三個維度進行詳細分析&#xff1a; 一、漏洞…

Windows逆向工程入門之MASM數據結構使用

公開視頻 -> 鏈接點擊跳轉公開課程博客首頁 -> ???鏈接點擊跳轉博客主頁 目錄 第一章&#xff1a;MASM數據定義體系精要 1.1 基礎數據類型全景 1.1.1 整型數據規范 1.1.2 浮點數據編碼 1.2 復合數據結構 1.2.1 多維數組定義 1.2.2 復雜結構體 第二章&#xf…

筑牢安全防線:工商業場所燃氣泄漏防護新方案

燃氣安全是企業經營不可逾越的生命線。在餐飲后廚、化工車間、酒店鍋爐房等場所&#xff0c;可燃氣體一旦泄漏&#xff0c;極易引發嚴重事故。如何實現精準監測、快速響應&#xff0c;成為工業及商業領域安全管理的核心訴求。旭華智能深耕安全監測領域&#xff0c;推出的工業及…

本地部署大數據集群前置準備

1. 設置VMware網段 虛擬網絡編輯器——更改設置——選擇VMnet8——子網改成192.168.88.0——NAT設置——網關設置為192.168.88.2 2. 下載CentOS操作系統 下載CentOS 7.6(1810)版本 3. 在VMware中安裝CentOS操作系統 創建新的虛擬機——典型——安裝光盤映像文件——輸入賬…