Kotlin高階函數(shù)

使用kotlin一年多了得滤,基本的開發(fā)都能用陨献,但是kotlin的很多蜜糖高階函數(shù)還沒有用起來。懂更。眨业。有時候就算看過急膀,也很容易忘記。龄捡。卓嫂。所以就寫篇文章 對應(yīng)詳細的代碼demo,以便下次能快速看懂理解使用方法聘殖。晨雳。

高階函數(shù)

111.png

forEach 便利

fun main(args: Array<String>) {
    var list = listOf(1, 2, 3, 4, 5, 6)
    list.forEach(::println)

    val newList = arrayListOf<String>() --->1,2,3,4,5,6

    list.forEach {
        newList.add((it * 2).toString()) --->2,4,6,8,10,12
    }
    
    newList.forEach(::println)
}

map 變換

fun main(args: Array<String>) {
    val list = listOf(1, 2, 3, 4, 5, 6)

    val newList = list.map {
        //對集合中的數(shù)據(jù)進行操作,然后賦值給新的集合
        (it * 2).toString()
    }.forEach(::println) //2 4 6 8 10 12

    val doubleList = list.map {
        it.toDouble()
    }.forEach(::print) //1.0 2.0 3.0 4.0 5.0 6.0
    //函數(shù)作為參數(shù)的第二種方式調(diào)用 類名::方法名
    val doubleList2 = list.map(Int::toDouble).forEach(::print) ////1.0 2.0 3.0 4.0 5.0 6.0

}

flatMap 對集合的集合進行變換

fun main(args: Array<String>) {
    val list = arrayOf(
        1..5,
        50..55
    )

    //把多個數(shù)組集合變成一個數(shù)組奸腺,并且對數(shù)據(jù)進行變換
    val mergeList = list.flatMap { intRange -> //集合內(nèi)的集合 1..5 , 50..55
        intRange.map { intElement -> //集合內(nèi)集合遍歷 1,2,3,4,5
            "No.$intElement"
        }
    }
    //No.1 , No.2 , No.3 , No.4 , No.5 , No.50 , No.51 , No.52 , No.53 , No.54 , No.55 ,
    mergeList.forEach { print("$it , ") }

    println()
    //直接多個數(shù)組集合變換成一個結(jié)集合
    val newList = list.flatMap {
        it
    }
    //1 , 2 , 3 , 4 , 5 , 50 , 51 , 52 , 53 , 54 , 55 ,
    newList.forEach { print("$it , ") }
}

reduce 餐禁,fold,foldRight 倒敘, joinToString轉(zhuǎn)換字符去

fun main(args: Array<String>) {
    val list = arrayOf(
        1..5,
        2..3
    )

    val newList = list.flatMap {
        it
    }
    //1 , 2 , 3 , 4 , 5 , 50 , 51 , 52 , 53 , 54 , 55 ,
    newList.forEach { print("$it , ") }

    //求和 reduce 返回值必須是 acc類型
    println(newList.reduce { acc, i -> acc + i }) //20

    //帶基數(shù)求和
    println(newList.fold(10) { acc, i -> acc + i }) //30


    //fold 返回值類型是 "基數(shù)" 對應(yīng)的類型,比如 StringBuilder hello--1--2--3--4--5--2--3--
    println(newList.fold(StringBuilder("hello--")) { acc, i -> acc.append(i).append("--") }) //30

    //拼接字符串 1---, 2---, 3---, 4---, 5---, 2---, 3---
    println(newList.joinToString { "$it---" })
    
}

filter 篩選 filterIndexed 下標(biāo)篩選

fun main(args: Array<String>) {
    val list = arrayOf(
        1..5,
        2..3
    )
    val newList = list.flatMap {
        it
    }
    //篩選 集合中數(shù)據(jù) > 2的item
    val filterList = newList.filter { it > 2 }
    filterList.forEach(::print) //3453
    //篩選 集合中下標(biāo)是奇數(shù)item
    val filterIndexList = newList.filterIndexed { index, i -> index % 2 == 0; }
    filterIndexList.forEach { print(it) } //1 3 5 3
}

takeWhile 截至條件

fun main(args: Array<String>) {
    val list = arrayOf(
        1..5,
        2..3
    )
    val newList = list.flatMap {
        it
    }
    //截取符合條件的前面的所以的item 1234523突照,< 3 帮非,12
   // newList.takeWhile { it < 3 }.forEach { print(it) } // 1 2

    //返回包含 最后[n]元素 的列表。讹蘑,包含最后2個元素
    newList.takeLast(2).forEach(::print) // 23
}

?. 判空執(zhí)行末盔,let 類作為參數(shù),apply 類擴展

fun main(args: Array<String>) {
    val person = getPerson()
    println(person?.name) //判空處理座慰,如果不為空 執(zhí)行后面的方法

    person?.let { //類作為參數(shù) it
        println(it.name)
        println(it.age)
        it.work()
    }

    person?.apply { //類擴展 可以直接調(diào)用
        println(name)
        println(age)
        work()
    }
}

fun getPerson(): Person? {
    return Person("shadow", 18)
}

class Person(val name: String, val age: Int) {
    fun work() {
        println("hello shadow")
    }
}

with

定義:fun <T, R> with(receiver: T, block: T.() -> R): R
功能:將對象作為函數(shù)的參數(shù)庄岖,在函數(shù)內(nèi)可以通過 this指代該對象。返回值為函數(shù)的最后一行或return表達式角骤。

fun main(args: Array<String>) {
    val br = BufferedReader(FileReader("shadow.txt"))
    br.readLine()
    br.read()
    //使用給定的[receiver]調(diào)用指定的函數(shù)[block]并返回其結(jié)果。
   /* with(br) {
        var readLine: String?
        while (true) {
            readLine = readLine() ?: break //如果不為空 就執(zhí)行前面的表達式 否則執(zhí)行后面的表達式
            println(readLine)
        }
        close()
    }*/
}

user

use函數(shù)會自動關(guān)閉調(diào)用者(無論中間是否出現(xiàn)異常)
Kotlin的File對象和IO流操作變得行云流水
use函數(shù)內(nèi)部實現(xiàn)也是通過try-catch-finally塊捕捉的方式心剥,所以不用擔(dān)心會有異常拋出導(dǎo)致程序退出
close操作在finally里面執(zhí)行邦尊,所以無論是正常結(jié)束還是出現(xiàn)異常,都能正確關(guān)閉調(diào)用者

  BufferedReader(FileReader("build.gradle")).use {
        var readLine: String?
        while (true) {
            readLine = readLine() ?: break //如果不為空 就執(zhí)行前面的表達式 否則執(zhí)行后面的表達式
            println(readLine)
        }
    }

閉包函數(shù)

閉包函數(shù) 一個函數(shù)的返回值是函數(shù)优烧,函數(shù)的內(nèi)部包含另一個函數(shù)蝉揍,可以是有參無參的匿名函數(shù)

fun main(args: Array<String>) {
    val mm = aaa()
    println(mm())
    println(mm())
    println(mm())
    println(mm())
    println(mm())

    val  kk = bbb()
    println(kk("shadow")) //shadow --- 1
    println(kk("shadow")) //shadow --- 2
    println(kk("shadow")) //shadow --- 3
    println(kk("shadow")) //shadow --- 4
    println(kk("shadow")) //shadow --- 5

}

//閉包函數(shù) 就是函數(shù)作為返回參數(shù)
fun aaa(): () -> (Int) {
    var current = 10
    return fun(): Int {
        return current++
    }
}

fun bbb(): (String) -> (String) {
    var current = 0;
    return fun(str: String): String {
        current++;
        return "$str --- $current";
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市畦娄,隨后出現(xiàn)的幾起案子又沾,更是在濱河造成了極大的恐慌,老刑警劉巖熙卡,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杖刷,死亡現(xiàn)場離奇詭異,居然都是意外死亡驳癌,警方通過查閱死者的電腦和手機滑燃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來颓鲜,“玉大人表窘,你說我怎么就攤上這事典予。” “怎么了乐严?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵瘤袖,是天一觀的道長。 經(jīng)常有香客問我昂验,道長捂敌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任凛篙,我火速辦了婚禮黍匾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘呛梆。我一直安慰自己锐涯,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布填物。 她就那樣靜靜地躺著纹腌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪滞磺。 梳的紋絲不亂的頭發(fā)上升薯,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天,我揣著相機與錄音击困,去河邊找鬼涎劈。 笑死,一個胖子當(dāng)著我的面吹牛阅茶,可吹牛的內(nèi)容都是我干的蛛枚。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼脸哀,長吁一口氣:“原來是場噩夢啊……” “哼蹦浦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起撞蜂,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤盲镶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蝌诡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體溉贿,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年浦旱,在試婚紗的時候發(fā)現(xiàn)自己被綠了顽照。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖代兵,靈堂內(nèi)的尸體忽然破棺而出尼酿,到底是詐尸還是另有隱情,我是刑警寧澤植影,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布裳擎,位于F島的核電站,受9級特大地震影響思币,放射性物質(zhì)發(fā)生泄漏鹿响。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一谷饿、第九天 我趴在偏房一處隱蔽的房頂上張望惶我。 院中可真熱鬧,春花似錦博投、人聲如沸绸贡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽听怕。三九已至,卻和暖如春虑绵,著一層夾襖步出監(jiān)牢的瞬間尿瞭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工翅睛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留声搁,地道東北人。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓捕发,卻偏偏與公主長得像疏旨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子爬骤,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 用過Kotlin的同學(xué)都知道,那些擴展方法用起來簡直不要太爽莫换,那么這些擴展方法是怎么定義實現(xiàn)的呢霞玄,本文介紹了Kot...
    我是黃教主啊閱讀 11,915評論 0 22
  • 聲明高階函數(shù) 顯示聲明 函數(shù)類型的返回值也可以標(biāo)記為可空類型: 定義一個函數(shù)類型的可空變量 調(diào)用作為參數(shù)的函數(shù) 看...
    蔣揚海閱讀 577評論 0 0
  • 在 Kotlin 中函數(shù)也是一等公民,這意味著我們定義的變量拉岁、函數(shù)參數(shù)坷剧、返回值都可以是函數(shù)類型的,可以像操作其它非...
    SheHuan閱讀 1,097評論 1 4
  • 文章目錄: Kotlin-高階函數(shù)的使用(一) 上一篇文章帶大家認識到了什么是高階函數(shù)喊暖,那這一章就帶大家看看高階函...
    我是黃教主啊閱讀 3,969評論 2 9
  • Nothing can I do 惫企,but enjoy hot summer I love u ,I hate u
    miniMily閱讀 92評論 0 1