kotlin函數類型

一 函數類型定義

1 定義

函數類型就是 (Int, Int) -> Int
函數類型其實就是將函數的 “參數類型” 和 “返回值類型” 抽象出來

2 示例 :

(Int, Int) -> Int 表示接收兩個 Int 參數并返回 Int 的函數類型;
(String) -> Unit 表示接收 String 參數且無返回值的函數類型空 。

3 函數類型定義(補充)

  1. 基本形式

    • (Int, Int) -> Int 表示接收兩個 Int 參數并返回 Int 的函數類型。
    • (String) -> Unit 表示接收 String 參數但無返回值的函數類型(Unit 表示無返回值)。
  2. 特殊情況

    • 無參數的函數() -> String(無參數,返回 String)。
    • 返回值是函數的函數類型(Int) -> (Int) -> Int(接收 Int,返回一個 (Int) -> Int 類型的函數)。
    • 可空的函數類型((Int, Int) -> Int)?(函數類型可為 null)。
  3. 函數類型的變量

    val sum: (Int, Int) -> Int = { a, b -> a + b }
    val printMessage: (String) -> Unit = { message -> println(message) }
    

二 Lambda 表達式

1 語法結構

{ 參數列表 -> 函數體 }

2 示例

示例:{ x: Int, y: Int -> x + y }
{a1:Int,b1:Int->a1+b1}

3 Lambda 表達式(補充)

  1. 省略參數類型(Kotlin 可以類型推導)

    val sum = { a: Int, b: Int -> a + b } // 顯式聲明參數類型
    val sum2: (Int, Int) -> Int = { a, b -> a + b } // 省略參數類型
    
  2. 單個參數時,使用 it(當 Lambda 只有一個參數時,it 代表該參數):

    val square: (Int) -> Int = { it * it }  // `it` 代表傳入的參數
    println(square(5)) // 輸出 25
    
  3. Lambda 作為參數傳遞

    fun operate(a: Int, b: Int, op: (Int, Int) -> Int): Int {return op(a, b)
    }val result = operate(3, 4) { x, y -> x * y }
    println(result) // 輸出 12
    
  4. Lambda 作為函數返回值

    fun getOperator(): (Int, Int) -> Int {return { x, y -> x + y }
    }val add = getOperator()
    println(add(10, 5)) // 輸出 15

三、高階函數

高階函數 指的是 接受函數類型作為參數或返回值的函數
示例:

fun highOrderFunction(operation: (Int, Int) -> Int): Int {return operation(10, 20)
}val result = highOrderFunction { a, b -> a + b }
println(result) // 輸出 30

總結

  1. 函數類型的特殊情況(無參數、返回值是函數、可空類型)。
  2. Lambda 表達式的簡化寫法(省略參數類型、it 關鍵字)。
  3. Lambda 作為參數和返回值
  4. 高階函數(函數可以接收 Lambda 作為參數)。

四 函數體

在 Kotlin 中,函數體(Function Body) 是定義函數具體行為的代碼塊,即 {} 大括號中的內容。它包含了函數要執行的邏輯和操作,具體分為兩種形式:


1. 代碼塊函數體(Block Body)

當函數需要執行多行邏輯時使用,必須顯式聲明返回值(如果有返回值)。

// 完整函數體(包含 return)
fun add(a: Int, b: Int): Int {val sum = a + breturn sum
}// 無返回值的函數(Unit 可省略)
fun printMessage(message: String) {println("Message: $message")
}

2. 單表達式函數體(Single-Expression Body)

當函數可以通過單個表達式完成時,可省略 {} 并用 = 直接返回結果,編譯器會自動推導返回值類型。

// 等價于代碼塊函數體,但更簡潔
fun add(a: Int, b: Int) = a + b// 配合 when 表達式
fun getTypeName(type: Int) = when(type) {1 -> "A/C"2 -> "Heater"else -> "Unknown"
}

關鍵區別

特性代碼塊函數體單表達式函數體
語法{} 包裹= 連接表達式
返回值必須顯式 return自動返回表達式結果
類型推導需顯式聲明返回值類型可省略返回值類型聲明
適用場景多行邏輯、復雜操作簡單計算、條件判斷

注意事項

? 類型推導限制:單表達式函數體僅在邏輯簡單時可自動推導類型,復雜邏輯仍需顯式聲明。
? 作用域:代碼塊函數體中定義的變量(如示例中的 sum)僅在函數體內可見。
? 空函數體:無實際操作的函數可以留空 {},但需聲明返回類型為 Unit(可省略)。

如果在 Android 開發中遇到函數體相關的具體問題(如事件回調的 lambda 簡化寫法等),可以進一步探討!

五 省略參數列表情況

在 Kotlin 中,當 Lambda 表達式只有一個參數時,可以省略參數列表,直接使用 it 關鍵字來引用這個唯一的參數

你的代碼:

val square: (Int) -> Int = { it * it }

實際上等價于:

val square: (Int) -> Int = { x -> x * x }

這里 x 是 Lambda 的唯一參數。

為什么可以省略參數列表?

原因
Kotlin 允許在 只有一個參數 的 Lambda 表達式中,使用 it 作為默認參數名稱,省略顯式聲明。

規則:

  1. 如果 Lambda 只有一個參數,就可以用 it 代替參數列表:

    val printMessage: (String) -> Unit = { println(it) }
    printMessage("Hello")  // 輸出 Hello
    

    相當于:

    val printMessage: (String) -> Unit = { message -> println(message) }
    
  2. 如果 Lambda 有多個參數,就必須顯式聲明參數列表:

    val sum: (Int, Int) -> Int = { a, b -> a + b } // 必須寫參數名
    

    不能寫成 { it + it },因為 Kotlin 無法知道 it 代表哪一個參數。


示例:省略參數 vs 顯式參數

// 只有一個參數,使用 it
val double: (Int) -> Int = { it * 2 }  
println(double(5)) // 輸出 10// 兩個參數,必須顯式聲明
val add: (Int, Int) -> Int = { a, b -> a + b }
println(add(3, 4)) // 輸出 7

結論
? it 適用于單參數 Lambda,當 Lambda 只有一個參數時,可以省略參數列表,直接用 it 代替。
? 多參數 Lambda 不適用 it,必須顯式定義參數列表。

這樣寫代碼更簡潔,減少不必要的參數命名,讓 Lambda 表達式更加直觀!

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

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

相關文章

C# Winform 入門(9)之如何封裝并調用dll

封裝dll 首先創建 .Net平臺 類庫 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace _09.Encapsulation_dll {public class Program{/// <summary>/// 求兩個double類型的數值的和/// &l…

前后端分離下,Spring Boot 請求從發起到響應的完整執行流程

以下是前后端分離架構下&#xff0c;Spring Boot 請求從發起到響應的完整執行流程&#xff0c;結合你提出的所有問題&#xff0c;按真實執行順序和職責鏈條重新整理所有核心概念、結構、關鍵類、數據轉換點和典型代碼示例&#xff1a; 一、前端發起請求&#xff08;步驟1-2&…

基于sklearn實現文本摘要思考

和各位小伙伴分享一下使用sklearn進行文本摘要的思考。 第一版本 原理 提取式文本摘要的基本原理是&#xff1a; 將文本分割成句子 計算每個句子的重要性(權重) 選擇權重最高的幾個句子組成摘要 常用的句子權重計算方法&#xff1a; TF-IDF&#xff1a;基于詞頻-逆文檔頻…

OpenHarmony子系統開發 - DFX(三)

OpenHarmony子系統開發 - DFX&#xff08;三&#xff09; 五、HiTraceMeter開發指導 HiTraceMeter概述 簡介 HiTraceMeter在OpenHarmony中&#xff0c;為開發者提供業務流程調用鏈跟蹤的維測接口。通過使用該接口所提供的功能&#xff0c;可以幫助開發者迅速獲取指定業務流…

2025年 能夠有效提升AI的生成質量和邏輯嚴謹性 的通用型系統提示

以下是三個經過精心設計的通用型系統提示&#xff08;System Prompt&#xff09;&#xff0c;能夠有效提升AI的生成質量和邏輯嚴謹性&#xff0c;適用于各類對話、分析和創作場景&#xff1a; Prompt 1 - 專家級分步驗證模式 你是一個具備跨領域知識整合能力的超級AI&#xff…

python爬蟲:小程序逆向實戰教程

根據我之前發表的文章&#xff0c;我們進行延伸實戰https://blog.csdn.net/weixin_64809364/article/details/146981598?spm1001.2014.3001.5501 1. 想要爬取什么小程序&#xff0c;我們進行搜索 2. 找到我們vx小程序的文件地址&#xff0c;我們就可以進行破解 破解步驟強看…

C語言變長數組(VLA)詳解:靈活處理動態數據的利器

引言 在C語言中&#xff0c;傳統的數組大小必須在編譯時確定&#xff0c;這限制了程序處理動態數據的靈活性。C99標準引入的變長數組&#xff08;Variable-Length Array, VLA&#xff09; 打破了這一限制&#xff0c;允許數組長度在運行時動態確定。本文將深入解析VLA的語法、…

串口數據轉換為IP數據

串口數據轉換為IP數據是一種常見的通信技術,用于將傳統的串行設備(如傳感器、控制器等)接入現代的IP網絡。以下是詳細介紹: 1. 轉換原理 串口數據轉換為IP數據的過程涉及硬件和軟件的結合,核心是將串行數據封裝為TCP/IP或UDP/IP數據包,通過網絡傳輸。具體步驟如下: 硬…

client-go如何監聽自定義資源

如何使用 client-go 監聽自定義資源 在 Kubernetes 中使用 client-go 監聽自定義資源&#xff08;Custom Resource&#xff0c;簡稱 CR&#xff09;需要借助 Dynamic Client 或 Custom Informer&#xff0c;因為 client-go 的標準 Clientset 只支持內置資源&#xff08;如 Pod…

C++軟件開發架構

文章目錄 1.全局消息通信MsgHandler.h單元測試(QTest)MsgHandlerUnitTest.hMsgHandlerUnitTest.cpp 2.實例間通信InstMsgHandler.h單元測試InstMsgHandlerUnitTest.hInstMsgHandlerUnitTest.cpp 1.全局消息通信 1. 適用于類與類單個對象實例之間的通信&#xff0c;多個對象需要…

AI Agent設計模式一:Chain

概念 &#xff1a;線性任務流設計 ? 優點&#xff1a;邏輯清晰易調試&#xff0c;適合線性處理流程? 缺點&#xff1a;缺乏動態分支能力 from typing import TypedDictfrom langgraph.graph import StateGraph, END# 定義后續用到的一些變量 class CustomState(TypedDict):p…

Git三劍客:工作區、暫存區、版本庫深度解析

一、引言&#xff1a;為什么需要理解Git的核心區域&#xff1f; 作為開發者&#xff0c;Git是日常必備的版本控制工具。但你是否曾因以下問題感到困惑&#xff1f; 修改了文件&#xff0c;但 git status 顯示一片混亂&#xff1f; git add 和 git commit 到底做了什么&#x…

Python數據類型-list

列表(List)是Python中最常用的數據類型之一&#xff0c;它是一個有序、可變的元素集合。 1. 列表基礎 創建列表 empty_list [] # 空列表 numbers [1, 2, 3, 4, 5] # 數字列表 fruits [apple, banana, orange] # 字符串列表 mixed [1, hello, 3.14, True] # 混合類型…

Keepalive+LVS+Nginx+NFS高可用項目

項目架構 分析 主機規劃 主機系統安裝應用網絡IPclientredhat 9.5無NAT172.25.250.115/24lvs-masterrocky 9.5ipvsadm&#xff0c;keepalivedNAT172.25.250.116/24 VIP 172.25.250.100/32lvs-backuprocky 9.5ipvsadm&#xff0c;keepalivedNAT172.25.250.117/24 VIP 172.25.2…

【視覺與語言模型參數解耦】為什么?方案?

一些無編碼器的MLLMs統一架構如Fuyu&#xff0c;直接在LLM內處理原始像素&#xff0c;消除了對外部視覺模型的依賴。但是面臨視覺與語言模態沖突的挑戰&#xff0c;導致訓練不穩定和災難性遺忘等問題。解決方案則是通過參數解耦方法解決模態沖突。 在多模態大語言模型&#xf…

AI比人腦更強,因為被植入思維模型【43】蝴蝶效應思維模型

giszz的理解&#xff1a;蝴蝶效應我們都熟知&#xff0c;就是說一個微小的變化&#xff0c;能帶動整個系統甚至系統的空間和時間的遠端&#xff0c;產生巨大的鏈式反應。我學習后的啟迪&#xff0c;簡單的說&#xff0c;就是不要忽視任何微小的問題&#xff0c;更多時候&#x…

AI 數理邏輯基礎之統計學基本原理(上)

目錄 文章目錄 目錄統計學統計學基本概念描述性統計數據可視化圖表工具 匯總統計統計數據的分布情況&#xff1a;中位數、眾數、平均值統計數據的離散程度&#xff1a;極差、方差、標準差、離散系數 相關分析Pearson 線性關系相關系數Spearman 單調關系相關系數 回歸分析回歸模…

無招回歸阿里

這兩天&#xff0c;無招回歸阿里的新聞被刷屏了。無招創業成立的兩氫一氧公司無招的股份也被阿里收購&#xff0c;無招以這種姿態回歸阿里&#xff0c;并且出任釘釘的 CEO。有人說&#xff0c;這是對 5 年前“云釘一體”戰略的糾偏。現在確實從云優先到 AI 優先&#xff0c;但云…

算法題(114):矩陣距離

審題&#xff1a; 本題需要我們找出所有0距離最近的1的曼哈頓距離 思路&#xff1a; 方法一&#xff1a;多源bfs 分析曼哈頓距離&#xff1a; 求法1&#xff1a;公式法&#xff0c;帶入題目公式&#xff0c;利用|x1-x2||y1-y2|求出 求法2&#xff1a;曼哈頓距離就是最短距離 本…

LLM 性能優化有哪些手段?

LLM(大語言模型)性能優化是一個多維度、多層次的系統工程,涉及從提示工程到模型微調,從推理加速到系統架構優化等多個方面。以下是當前主流的優化手段及其技術細節: 一、提示工程(Prompt Engineering) 提示工程是優化LLM性能最直接、成本最低的方法,適用于快速原型開發…