Kotlin匿名函數(shù)使用介紹
1.函數(shù)的聲明
kotlin中函數(shù)的聲明和java中有所不同。
1)得有fun關(guān)鍵字修飾,
2)參數(shù)的聲明方式和變量聲明類似 age:Int,先寫參數(shù)名,后面跟著參數(shù)類型
3) 返回值類型寫在參數(shù)的后面。
//可見性修飾符 函數(shù)關(guān)鍵字 方法法名 參數(shù)名 參數(shù)類型 返回值 private fun functionName(age: Int, name: String): String { return name + age; }
2.函數(shù)參數(shù)
默認(rèn)值參:如果不打算傳入值參,可以預(yù)先給參數(shù)設(shè)定默認(rèn)值
fun main() { //通常調(diào)用方式 fix("xiaohua", 20) //age已經(jīng)給定默認(rèn)值,此時(shí)可以不傳參數(shù) fix("xiaohua") } //參數(shù)age 給定默認(rèn)值 fun fix(name: String, age: Int = 18) { println(name + age) }
3.Unit函數(shù)
Kotlin中沒有返回值的函數(shù)叫Unit函數(shù),也就是說他們的返回值是Unit
可以打印一下上面定義的fix函數(shù)。打印的值是kotlin.Unit。
println( fix("xiaohua"))
4.匿名函數(shù)
定義時(shí)不取名字的函數(shù),被稱為匿名函數(shù)。
1)具名函數(shù)的聲明:會(huì)顯示的使用fun關(guān)鍵字修飾。
//具名函數(shù) fun sayHello(): String { return "Hello world!" } fun main() { //具名函數(shù)調(diào)用 println(sayHello()) }
匿名函數(shù):
1)匿名函數(shù)雖然沒有名字,但是可以賦值給變量,這個(gè)變量的類型就是函數(shù)類型。就像其他變量賦值那樣。
2)和具名函數(shù)不一樣,匿名函數(shù)通常不需要return關(guān)鍵字返回?cái)?shù)據(jù)。匿名函數(shù)會(huì)隱式的或自動(dòng)返回最后一行代碼的執(zhí)行結(jié)果。
普通變量賦值:
val hello: String = "hello"
匿名函數(shù)賦值變量:
fun main() { //聲明一個(gè)匿名函數(shù),并賦值給變量sayHello val sayHello: () -> String = { "Hello world!" } //匿名函數(shù)調(diào)用 println(sayHello()) }
3)匿名函數(shù)類型。
普通變量的類型在賦值時(shí)就指定了,或者通過類型推斷,由編譯器在編譯器指定變量類型。
那么匿名函數(shù)的類型是啥,由啥決定?
匿名函數(shù)的類型是由參數(shù)和返回值決定的。
fun main() { //聲明一個(gè)匿名函數(shù),并賦值給變量sayHello val sayHello: () -> String = { "Hello world!" } //打印函數(shù)變量 println(sayHello) }
得到的結(jié)果是Function0<java.lang.String>
Function0:Function后的數(shù)字表示的是參數(shù)的個(gè)數(shù),0表示無參,1表示一個(gè)參數(shù),以此類推。
<java.lang.String> 表示的是匿名函數(shù)返回值類型。
5.匿名函數(shù)的參數(shù)
匿名函數(shù)可以不帶參數(shù),也可以帶一個(gè)參數(shù)或多個(gè)參數(shù)。
需要帶參數(shù)時(shí),參數(shù)類型放在匿名函數(shù)的類型定義中“()”,參數(shù)名放在函數(shù)定義中“{}”。
1)一個(gè)參數(shù)的定義:
fun main() { val sayHello: (name: String) -> String = { name -> "Hello $name!" } println(sayHello("HanMei")) }
當(dāng)匿名函數(shù)的參數(shù)只有一個(gè)時(shí),可以使用it關(guān)鍵字來表示參數(shù)名。當(dāng)有多個(gè)參數(shù)時(shí)就不能使用了。
fun main() { val sayHello: (name: String) -> String = { "Hello $it!" } println(sayHello("HanMei")) }
2)定義多個(gè)參數(shù)的匿名函數(shù)
fun main() { val sayHello: (String, Int) -> String = { name, age -> "Hello $name$age" } println(sayHello("HanMei",18)) }
3)類型推斷。
我們知道定義普通變量時(shí),在編碼階段可以不用給變量指定類型。
當(dāng)我們把匿名函數(shù)賦值給變量時(shí),也可以不用指定函數(shù)的返回值類型,有編譯器進(jìn)行類型推斷。
這時(shí)定義匿名函數(shù)時(shí)的“: () -> String”都可以省略。
無參數(shù)時(shí)的類型推斷:
fun main() { val sayHello = { "Hello world!" } println(sayHello()) }
一個(gè)參數(shù)的類型推斷:
參數(shù)定義和返回值定義可以省略。但是必須在函數(shù)定義中,指定參數(shù)類型和參數(shù)名。
fun main() { val sayHello={ name:String -> "Hello $name!" } println(sayHello("HanMei")) }
多個(gè)參數(shù)的類型推斷:
fun main() { val sayHello = { name: String, age: Int -> "Hello $name$age!" } println(sayHello("HanMei", 18)) }
6.lambda表達(dá)式
我們將匿名函數(shù)稱為lambda函數(shù)。將他的定義稱為lambda表達(dá)式,他的返回結(jié)果稱為lambda結(jié)果
7.定義參數(shù)
定義參數(shù)是匿名函數(shù)的函數(shù):函數(shù)的參數(shù)是另外一個(gè)匿名函數(shù)。
1)先定義一個(gè)具名函數(shù),接收一個(gè)匿名函數(shù)為參數(shù)。
//定義一個(gè)具名函數(shù),接收一個(gè)String參數(shù)和一個(gè)函數(shù)參數(shù)happyNewYear //happyNewYear: (name: String, year: Int) -> String 這個(gè)就是匿名函數(shù)的定義 fun sayhello(name: String, happyNewYear: (name: String, year: Int) -> String) { val year = 2022 //在具名函數(shù)中調(diào)用傳遞進(jìn)來的匿名函數(shù) println(happyNewYear(name,year)) }
2)定義一個(gè)匿名函數(shù),調(diào)用具名函數(shù)時(shí),當(dāng)作參數(shù)傳遞過去。
fun main() { //定義一個(gè)匿名函數(shù) val happyNewYear = { name: String, year: Int -> "${name},happy ${year}!" } //調(diào)用具名函數(shù),并把匿名函數(shù)當(dāng)作參數(shù)傳遞 sayhello("HanMei", happyNewYear) }
3)上面的匿名函數(shù)可以不單獨(dú)定義,也可以在調(diào)用時(shí)定義實(shí)現(xiàn)。
這種寫法和java中的匿名內(nèi)部類是不是很像。方法的參數(shù)new一個(gè)接口,實(shí)現(xiàn)接口中的方法。
fun main() { sayhello("HanMei", happyNewYear = { name: String, year: Int -> "${name},happy ${year}!" }) }
4)如果lambda是一個(gè)函數(shù)的最后一個(gè)參數(shù),或者是唯一的參數(shù)。那么,括住lambda值參的一對(duì)圓括號(hào)可以去掉。
fun main() { sayhello("HanMei") { name: String, year: Int -> "${name},happy ${year}!" } }
8.匿名函數(shù)
匿名函數(shù)還可以用于擴(kuò)展Kotlin的內(nèi)置函數(shù)。
count是Kotlin用于計(jì)算字符串長(zhǎng)度的內(nèi)置函數(shù)。
val word = "HappyNewYear" var count = word.count()
用匿名函數(shù)進(jìn)行擴(kuò)展
count = word.count({ letter -> letter == 'a' })
我們知道:當(dāng)函數(shù)的最后一個(gè)參數(shù)或只有一個(gè)參數(shù)是lambda時(shí),那對(duì)圓括號(hào)可以省略
count = word.count { letter -> letter == 'a' }
我們又知道,當(dāng)參數(shù)只有一個(gè)時(shí),可以用it代替
count = word.count { it == 'a' }
9.函數(shù)的引用
要把函數(shù)作為參數(shù)傳遞給其他函數(shù),除了lambda表達(dá)式,kotlin還提供了其他方法--函數(shù)引用
函數(shù)引用可以把一個(gè)具名函數(shù)轉(zhuǎn)換成一個(gè)值參,傳遞給其他函數(shù)。
使用lambda表達(dá)式的地方,都可以使用函數(shù)引用。
1)首先定義兩個(gè)具名函數(shù):
happyNewYear就是一個(gè)普通函數(shù)。
sayhello可以接收一個(gè)函數(shù)參數(shù)。這個(gè)函數(shù)參數(shù)可以接收一個(gè)匿名函數(shù),也可以接收一個(gè)函數(shù)引用。
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) 函數(shù)引用的使用:雙冒號(hào)+函數(shù)名,就是這個(gè)函數(shù)的引用,可以當(dāng)做值參傳遞
fun main() { //::happyNewYear這個(gè)就是函數(shù)的引用, sayhello("HanMei",::happyNewYear) }
10.函數(shù)類型作為返回類型
一個(gè)函數(shù)的返回值,可以是另外一個(gè)函數(shù),函數(shù)類型也是有效的返回值類型。
sayhello是一個(gè)無參的方法,返回值類型是(String) -> String,這個(gè)表達(dá)的意思就是一個(gè)參數(shù)為String類型,返回值為String類型的匿名函數(shù)。
fun sayhello(): (String) -> String { return { val year = 2022 "$it happy $year" } }
調(diào)用方法:
fun main() { //調(diào)用sayhello得到這個(gè)匿名函數(shù),并賦值給變量happyNewYear val happyNewYear = sayhello(); //happyNewYear就是一個(gè)匿名函數(shù),可以直接傳參調(diào)用 println(happyNewYear("HanMei")) }
注意上面的返回匿名函數(shù)有這樣一句代碼,val year = 2022;這個(gè)是定義在匿名函數(shù)中的。
也可以定義在外邊的具名函數(shù)中,匿名函數(shù)仍然可以訪問的到。
fun sayhello(): (String) -> String { val year = 2022 return { "$it happy $year" } }
這就是另外一個(gè)概念。閉包
在Kotlin中,匿名函數(shù),能修改并引用定義在自己作用域之外的變量,匿名函數(shù)引用著定義自身的函數(shù)里的變量。也就是說sayhello返回的匿名函數(shù),可以引用定義它的函數(shù)sayhello的變量。
Kotlin的lambda就是閉包。
到此這篇關(guān)于Kotlin匿名函數(shù)使用介紹的文章就介紹到這了,更多相關(guān)Kotlin匿名函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android 后臺(tái)生成長(zhǎng)圖并分享示例(非長(zhǎng)截圖)
這篇文章主要介紹了Android 后臺(tái)生成長(zhǎng)圖并分享示例(非長(zhǎng)截圖),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08Intent傳遞對(duì)象之Serializable和Parcelable的區(qū)別
Intent在不同的組件中傳遞對(duì)象數(shù)據(jù)的應(yīng)用非常普遍,大家都知道在intent傳遞對(duì)象的方法有兩種:1、實(shí)現(xiàn)Serializable接口、2、實(shí)現(xiàn)Parcelable接口,接下來通過本文給大家介紹Intent傳遞對(duì)象之Serializable和Parcelable的區(qū)別,感興趣的朋友一起學(xué)習(xí)吧2016-01-01Android 日期和時(shí)間的使用實(shí)例詳解
這篇文章主要介紹了Android 日期和時(shí)間的使用實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2016-12-12Android 校驗(yàn)email是否合法實(shí)現(xiàn)代碼
這篇文章主要介紹了Android 校驗(yàn)email是否合法實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2017-01-01Android ListView自動(dòng)生成列表?xiàng)l目的實(shí)例
下面小編就為大家分享一篇Android ListView自動(dòng)生成列表?xiàng)l目的實(shí)例,具有很好的 參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-01-01簡(jiǎn)單實(shí)現(xiàn)android輪播圖
這篇文章主要為大家詳細(xì)介紹了android輪播圖的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01Android viewpage實(shí)現(xiàn)禁止滑動(dòng)的功能
這篇文章主要介紹了Android viewpage實(shí)現(xiàn)禁止滑動(dòng)的功能的相關(guān)資料,這里附有實(shí)現(xiàn)的實(shí)例代碼,主要還是重新 ViewPage 這個(gè)類,需要的朋友可以參考下2016-11-11