Kotlin 語法基礎(chǔ)大全湖笨,從例子著手的 從0到1的學(xué)習(xí) -- 函數(shù)

Kotlin 語法基礎(chǔ)大全屯蹦,從例子著手的 從0到1的學(xué)習(xí) -- 基礎(chǔ)介紹
Kotlin 語法基礎(chǔ)大全宣蠕,從例子著手的 從0到1的學(xué)習(xí) -- 流程控制
Kotlin 語法基礎(chǔ)大全脖捻,從例子著手的 從0到1的學(xué)習(xí) -- 特殊的類
Kotlin 語法基礎(chǔ)大全夺溢,從例子著手的 從0到1的學(xué)習(xí) -- 函數(shù)
Kotlin 語法基礎(chǔ)大全论巍,從例子著手的 從0到1的學(xué)習(xí) -- 集合
Kotlin 語法基礎(chǔ)大全,從例子著手的 從0到1的學(xué)習(xí) -- 作用域
Kotlin 語法基礎(chǔ)大全风响,從例子著手的 從0到1的學(xué)習(xí) -- 代理
Kotlin 語法基礎(chǔ)大全嘉汰,從例子著手的 從0到1的學(xué)習(xí) -- 產(chǎn)品級特性
翻譯來源

高階函數(shù)

高階函數(shù) 是以另一個函數(shù)為參數(shù)或者返回值的函數(shù)。

以另一個函數(shù)為參數(shù)
fun calculate(x: Int, y: Int, operation: (Int, Int) -> Int): Int {  // 1
    return operation(x, y)                                          // 2
}

fun sum(x: Int, y: Int) = x + y                                     // 3

fun main() {
    val sumResult = calculate(4, 5, ::sum)                          // 4
    val mulResult = calculate(4, 5) { a, b -> a * b }               // 5
    println("sumResult $sumResult, mulResult $mulResult")
}
  • 1 定義一個高階函數(shù)状勤,他有兩個int參數(shù) x鞋怀,y双泪,同時他還有一個函數(shù)作為參數(shù):operation。在operation的申明中密似,他的參數(shù)和返回值已經(jīng)申明焙矛。
  • 2 這個高階函數(shù)的內(nèi)部實(shí)現(xiàn)是獲得operation的返回值在傳入x,y的情況下残腌。
  • 3 定義一個函數(shù)村斟,與operation的定義很像。
  • 4 執(zhí)行這個高階函數(shù)抛猫,傳入兩個int值的參數(shù)蟆盹,和傳入一個函數(shù)參數(shù)::sum:: 在kotlin中是一個使用名字來提取方法的符號闺金。
  • 5 執(zhí)行這個高階函數(shù)逾滥,插入兩個int值的參數(shù),和傳入一個lambda為參數(shù)掖看。這種寫法是不是看起來很簡潔匣距?
以一個函數(shù)作為返回值
fun operation(): (Int) -> Int {                                     // 1
    return ::square
}

fun square(x: Int) = x * x                                          // 2

fun main() {
    val func = operation()                                          // 3
    println(func(2))                                                // 4
}
  • 1 定義一個高階函數(shù),他返回一個函數(shù)作為返回值哎壳。在這里(Int) -> Int的寫法是申明的返回值的函數(shù)的結(jié)構(gòu)毅待。這里定義了返回square函數(shù)
  • 2 定義名字叫square的函數(shù),他的作用是返回x*x
  • 3 執(zhí)行這個高階函數(shù)归榕,獲取一個函數(shù)作為返回值尸红。在這里,operation()返回的func 就是square方法
  • 4 執(zhí)行func刹泄。這里square方法會被執(zhí)行外里、

lambda 表達(dá)式

Lambda表達(dá)式是一種為了方便創(chuàng)建函數(shù)對等式(就是 相當(dāng)于一種函數(shù))。lambda 可以很簡潔地表明函數(shù)特石,通過使用默認(rèn)參數(shù)it

// All examples create a function object that performs upper-casing.
// So it's a function from String to String

val upperCase1: (String) -> String = { str: String -> str.toUpperCase() } // 1

val upperCase2: (String) -> String = { str -> str.toUpperCase() }         // 2

val upperCase3 = { str: String -> str.toUpperCase() }                     // 3

// val upperCase4 = { str -> str.toUpperCase() }                          // 4

val upperCase5: (String) -> String = { it.toUpperCase() }                 // 5

val upperCase6: (String) -> String = String::toUpperCase                  // 6

println(upperCase1("hello"))
println(upperCase2("hello"))
println(upperCase3("hello"))
println(upperCase5("hello"))
println(upperCase6("hello"))
  • 1 A lambda in all its glory, with explicit types everywhere盅蝗。花括號里面的內(nèi)容就是lambda姆蘸,這部分被賦值為類型為 (String) -> String的一個內(nèi)容墩莫。
  • 2 lambda 內(nèi)部有發(fā)生類型推論。有這個推論的原因是逞敷,在外部定義了明確的類型狂秦。
  • 3 lambda 外部發(fā)生了類型推論,這是因?yàn)閘ambda 內(nèi)部的參數(shù)類型和返回值是可推論的
  • 4 你不能在lambda 內(nèi)部和外部同時省略類型推捐,這將無法進(jìn)行類型推論裂问。
  • 5 如果只有一個參數(shù),你可以不定義lambda 內(nèi)部的參數(shù)名字,默認(rèn)使用it
  • 6 如果你的lambda只有一個單一的函數(shù)調(diào)用堪簿,那么你就可以直接使用函數(shù)指針(::)

Extension Functions 擴(kuò)展函數(shù) 和 Properties 屬性

kotlin 可以通過 擴(kuò)展機(jī)制 讓你擴(kuò)展任何的class 痊乾。顧名思義,有兩種擴(kuò)展方式:擴(kuò)展方法和擴(kuò)展屬性戴甩。他們看起來像是普通的方法和屬性符喝,除了一點(diǎn),你必須明確的說明你是要擴(kuò)展那個類甜孤。

data class Item(val name: String, val price: Float)                                   // 1  

data class Order(val items: Collection<Item>)  

fun Order.maxPricedItemValue(): Float = this.items.maxBy { it.price }?.price ?: 0F    // 2  
fun Order.maxPricedItemName() = this.items.maxBy { it.price }?.name ?: "NO_PRODUCTS"

val Order.commaDelimitedItemNames: String                                             // 3
    get() = items.map { it.name }.joinToString()

fun main() {

    val order = Order(listOf(Item("Bread", 25.0F), Item("Wine", 29.0F), Item("Water", 12.0F)))
    
    println("Max priced item name: ${order.maxPricedItemName()}")                     // 4
    println("Max priced item value: ${order.maxPricedItemValue()}")
    println("Items: ${order.commaDelimitedItemNames}")                                // 5

}
/*
Max priced item name: Wine
Max priced item value: 29.0
Items: Bread, Wine, Water
*/
  • 1 定義了兩個 data class协饲,item 和 order ,其中 order 包含了一個items的屬性
  • 2 添加一個Order的擴(kuò)展函數(shù)
  • 3 添加一個Order的擴(kuò)展屬性
  • 4 執(zhí)行 order的 擴(kuò)張方法 maxPricedItemName()
  • 5 訪問 order的擴(kuò)展屬性 commaDelimitedItemNames

甚至你可以為null 擴(kuò)展方法缴川。在擴(kuò)展方法中茉稠,你可以對this 進(jìn)行檢查是否為null,并根據(jù)檢查結(jié)果做出你的邏輯

fun <T> T?.nullSafeToString() = this?.toString() ?: "NULL"  // 1
fun main() {
    println(null.nullSafeToString())
    println("Kotlin".nullSafeToString())
}
  • 1 定義了一個泛型方法把夸,這個方法可以由null 來調(diào)用
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末而线,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子恋日,更是在濱河造成了極大的恐慌膀篮,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件岂膳,死亡現(xiàn)場離奇詭異誓竿,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)谈截,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門筷屡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事」袢ィ” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵扼倘,是天一觀的道長。 經(jīng)常有香客問我除呵,道長唉锌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任竿奏,我火速辦了婚禮,結(jié)果婚禮上腥放,老公的妹妹穿的比我還像新娘泛啸。我一直安慰自己,他們只是感情好秃症,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布候址。 她就那樣靜靜地躺著吕粹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪岗仑。 梳的紋絲不亂的頭發(fā)上匹耕,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天,我揣著相機(jī)與錄音荠雕,去河邊找鬼稳其。 笑死,一個胖子當(dāng)著我的面吹牛炸卑,可吹牛的內(nèi)容都是我干的既鞠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼盖文,長吁一口氣:“原來是場噩夢啊……” “哼嘱蛋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起五续,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤洒敏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后疙驾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凶伙,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年荆萤,在試婚紗的時候發(fā)現(xiàn)自己被綠了镊靴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡链韭,死狀恐怖偏竟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情敞峭,我是刑警寧澤踊谋,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站旋讹,受9級特大地震影響殖蚕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜沉迹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一睦疫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鞭呕,春花似錦蛤育、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽底洗。三九已至,卻和暖如春咕娄,著一層夾襖步出監(jiān)牢的瞬間亥揖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工圣勒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留费变,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓灾而,卻偏偏與公主長得像胡控,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子旁趟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評論 2 355