網站首頁 編程語言 正文
1.函數的聲明
kotlin中函數的聲明和java中有所不同。
1)得有fun關鍵字修飾,
2)參數的聲明方式和變量聲明類似 age:Int,先寫參數名,后面跟著參數類型
3)? 返回值類型寫在參數的后面。
//可見性修飾符 函數關鍵字 方法法名 參數名 參數類型 返回值
private fun functionName(age: Int, name: String): String {
return name + age;
}
2.函數參數
默認值參:如果不打算傳入值參,可以預先給參數設定默認值
fun main() {
//通常調用方式
fix("xiaohua", 20)
//age已經給定默認值,此時可以不傳參數
fix("xiaohua")
}
//參數age 給定默認值
fun fix(name: String, age: Int = 18) {
println(name + age)
}
3.Unit函數
Kotlin中沒有返回值的函數叫Unit函數,也就是說他們的返回值是Unit
可以打印一下上面定義的fix函數。打印的值是kotlin.Unit。
println( fix("xiaohua"))
4.匿名函數
定義時不取名字的函數,被稱為匿名函數。
1)具名函數的聲明:會顯示的使用fun關鍵字修飾。
//具名函數
fun sayHello(): String {
return "Hello world!"
}
fun main() {
//具名函數調用
println(sayHello())
}
匿名函數:
1)匿名函數雖然沒有名字,但是可以賦值給變量,這個變量的類型就是函數類型。就像其他變量賦值那樣。
2)和具名函數不一樣,匿名函數通常不需要return關鍵字返回數據。匿名函數會隱式的或自動返回最后一行代碼的執行結果。
普通變量賦值:
val hello: String = "hello"
匿名函數賦值變量:
fun main() {
//聲明一個匿名函數,并賦值給變量sayHello
val sayHello: () -> String = {
"Hello world!"
}
//匿名函數調用
println(sayHello())
}
3)匿名函數類型。
普通變量的類型在賦值時就指定了,或者通過類型推斷,由編譯器在編譯器指定變量類型。
那么匿名函數的類型是啥,由啥決定?
匿名函數的類型是由參數和返回值決定的。
fun main() {
//聲明一個匿名函數,并賦值給變量sayHello
val sayHello: () -> String = {
"Hello world!"
}
//打印函數變量
println(sayHello)
}
得到的結果是Function0<java.lang.String>
Function0:Function后的數字表示的是參數的個數,0表示無參,1表示一個參數,以此類推。
<java.lang.String> 表示的是匿名函數返回值類型。
5.匿名函數的參數
匿名函數可以不帶參數,也可以帶一個參數或多個參數。
需要帶參數時,參數類型放在匿名函數的類型定義中“()”,參數名放在函數定義中“{}”。
1)一個參數的定義:
fun main() {
val sayHello: (name: String) -> String = { name ->
"Hello $name!"
}
println(sayHello("HanMei"))
}
當匿名函數的參數只有一個時,可以使用it關鍵字來表示參數名。當有多個參數時就不能使用了。
fun main() {
val sayHello: (name: String) -> String = {
"Hello $it!"
}
println(sayHello("HanMei"))
}
2)定義多個參數的匿名函數
fun main() {
val sayHello: (String, Int) -> String = { name, age ->
"Hello $name$age"
}
println(sayHello("HanMei",18))
}
3)類型推斷。
我們知道定義普通變量時,在編碼階段可以不用給變量指定類型。
當我們把匿名函數賦值給變量時,也可以不用指定函數的返回值類型,有編譯器進行類型推斷。
這時定義匿名函數時的“: () -> String”都可以省略。
無參數時的類型推斷:
fun main() {
val sayHello = {
"Hello world!"
}
println(sayHello())
}
一個參數的類型推斷:
參數定義和返回值定義可以省略。但是必須在函數定義中,指定參數類型和參數名。
fun main() {
val sayHello={ name:String ->
"Hello $name!"
}
println(sayHello("HanMei"))
}
多個參數的類型推斷:
fun main() {
val sayHello = { name: String, age: Int ->
"Hello $name$age!"
}
println(sayHello("HanMei", 18))
}
6.lambda表達式
我們將匿名函數稱為lambda函數。將他的定義稱為lambda表達式,他的返回結果稱為lambda結果
7.定義參數
定義參數是匿名函數的函數:函數的參數是另外一個匿名函數。
1)先定義一個具名函數,接收一個匿名函數為參數。
//定義一個具名函數,接收一個String參數和一個函數參數happyNewYear
//happyNewYear: (name: String, year: Int) -> String 這個就是匿名函數的定義
fun sayhello(name: String, happyNewYear: (name: String, year: Int) -> String) {
val year = 2022
//在具名函數中調用傳遞進來的匿名函數
println(happyNewYear(name,year))
}
2)定義一個匿名函數,調用具名函數時,當作參數傳遞過去。
fun main() {
//定義一個匿名函數
val happyNewYear = { name: String, year: Int ->
"${name},happy ${year}!"
}
//調用具名函數,并把匿名函數當作參數傳遞
sayhello("HanMei", happyNewYear)
}
3)上面的匿名函數可以不單獨定義,也可以在調用時定義實現。
這種寫法和java中的匿名內部類是不是很像。方法的參數new一個接口,實現接口中的方法。
fun main() {
sayhello("HanMei", happyNewYear = { name: String, year: Int ->
"${name},happy ${year}!"
})
}
4)如果lambda是一個函數的最后一個參數,或者是唯一的參數。那么,括住lambda值參的一對圓括號可以去掉。
fun main() {
sayhello("HanMei") { name: String, year: Int ->
"${name},happy ${year}!"
}
}
8.匿名函數
匿名函數還可以用于擴展Kotlin的內置函數。
count是Kotlin用于計算字符串長度的內置函數。
val word = "HappyNewYear"
var count = word.count()
用匿名函數進行擴展
count = word.count({ letter ->
letter == 'a'
})
我們知道:當函數的最后一個參數或只有一個參數是lambda時,那對圓括號可以省略
count = word.count { letter -> letter == 'a' }
我們又知道,當參數只有一個時,可以用it代替
count = word.count { it == 'a' }
9.函數的引用
要把函數作為參數傳遞給其他函數,除了lambda表達式,kotlin還提供了其他方法--函數引用
函數引用可以把一個具名函數轉換成一個值參,傳遞給其他函數。
使用lambda表達式的地方,都可以使用函數引用。
1)首先定義兩個具名函數:
happyNewYear就是一個普通函數。
sayhello可以接收一個函數參數。這個函數參數可以接收一個匿名函數,也可以接收一個函數引用。
fun happyNewYear(name: String, year: Int): String {
return "$name happy $year"
}
fun sayhello(name: String, happyNewYear: (name: String, year: Int) -> String) {
val year = 2022
println(happyNewYear(name, year))
}
2) 函數引用的使用:雙冒號+函數名,就是這個函數的引用,可以當做值參傳遞
fun main() {
//::happyNewYear這個就是函數的引用,
sayhello("HanMei",::happyNewYear)
}
10.函數類型作為返回類型
一個函數的返回值,可以是另外一個函數,函數類型也是有效的返回值類型。
sayhello是一個無參的方法,返回值類型是(String) -> String,這個表達的意思就是一個參數為String類型,返回值為String類型的匿名函數。
fun sayhello(): (String) -> String {
return {
val year = 2022
"$it happy $year"
}
}
調用方法:
fun main() {
//調用sayhello得到這個匿名函數,并賦值給變量happyNewYear
val happyNewYear = sayhello();
//happyNewYear就是一個匿名函數,可以直接傳參調用
println(happyNewYear("HanMei"))
}
注意上面的返回匿名函數有這樣一句代碼,val year = 2022;這個是定義在匿名函數中的。
也可以定義在外邊的具名函數中,匿名函數仍然可以訪問的到。
fun sayhello(): (String) -> String {
val year = 2022
return {
"$it happy $year"
}
}
這就是另外一個概念。閉包
在Kotlin中,匿名函數,能修改并引用定義在自己作用域之外的變量,匿名函數引用著定義自身的函數里的變量。也就是說sayhello返回的匿名函數,可以引用定義它的函數sayhello的變量。
Kotlin的lambda就是閉包。
原文鏈接:https://blog.csdn.net/niuyongzhi/article/details/126492035
相關推薦
- 2022-04-04 使用ivew開發樣式偶爾失效,布局錯亂
- 2023-03-15 pandas計算相關系數corr返回空的問題解決_python
- 2021-12-30 C++內存管理之簡易內存池的實現_C 語言
- 2021-09-09 Linux下NTP服務器配置詳細過程_Linux
- 2022-07-16 Spring的隔離級別&事務傳播屬性&數據庫隔離級別之間的聯系
- 2022-11-12 CSS單標簽實現復雜的棋盤布局_經驗交流
- 2022-04-03 django8.5?項目部署Nginx的操作步驟_nginx
- 2022-08-19 注解配置SpringMVC
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支