Kotlin基础 9

来源:互联网 发布:谷歌学术 知乎 编辑:程序博客网 时间:2024/04/29 23:55

高阶函数的基本概念
1.传入或者返回函数的函数
2.函数引用 ::println
3.带有Receiver的引用 pdfPrinter:println

fun main(args: Array<String>) {    val list: Array<String> = arrayOf("h", "e", "l","")    //方式一    list.forEach(::println)    //方式二    val filter = list.filter(String::isNotEmpty)    filter.forEach(::println)    //带有Receiver的引用 pdfPrinter:println    val pdfPrinter = PDFPrinter()    list.forEach(pdfPrinter::println)}class PDFPrinter{    fun println(param:String){        kotlin.io.println("PDF -> $param")    }}

常用高阶函数

forEach

    val list = listOf(1,2,3,4,5,8,10)    list.forEach(::println)

map

    val newList = list.map {        it * 2 + 3   //每个item x 2   3    }    //结果:[5, 7, 9, 11, 13, 19, 23]    println(newList)

flatMap

    val list = listOf(            1..20,            2..5,            100..105    )    val flatMap: List<String> = list.flatMap { itemRand ->        itemRand.map { itemElement ->            "No.$itemElement"        }    }    flatMap.forEach(::println)

reduce

    val list = listOf(            1..20,            2..5,            100..105    )    val flatList = list.flatMap{ it }    println(flatList.reduce { acc, i -> acc + i })  //得到总值

阶乘运算

fun main(args: Array<String>) {    //所有阶乘 的总和     val value = (0..6).map(::fatorial).reduce { acc, i -> acc + i }    println(value)}//阶乘计算fun fatorial(n:Int):Int{    if (n == 0) return 1    return (1..n).reduce { acc, i -> acc * i }}

fold

fun main(args: Array<String>) {    val  value = (0..6).map(::fatorial).fold(5){        acc, i -> acc + i    }    println(value)}//阶乘计算fun fatorial(n:Int):Int{    if (n == 0) return 1    return (1..n).reduce { acc, i -> acc * i }}
fun main(args: Array<String>) {    val  value = (0..6).map(::fatorial).fold(StringBuilder()){        acc, i -> acc.append(i).append(",")    }    //输出结果:1,1,2,6,24,120,720,    println(value)}//阶乘计算fun fatorial(n:Int):Int{    if (n == 0) return 1    return (1..n).reduce { acc, i -> acc * i }}

不得不提的 字符串连接

    //字符串连接函数:0,1,2,3,4,5,6    print((0..6).joinToString(","))

filter 过滤

fun main(args: Array<String>) {    //拿到所有的偶数    println((1..100).filter { it % 2 == 0 }) }

通过index过滤

fun main(args: Array<String>) {    println((1..100).filterIndexed { index, i -> index == 0 })}

takeWhile

当条件不满足时,循环

    //输出结果 : [0, 1, 2]    println((0..100).takeWhile { it != 3 })

let关键字

data class Person(val name:String,val age:Int)fun findPerson():Person?{    return Person("张三",20)}fun main(args: Array<String>) {    findPerson()?.let { (name,age) ->        //轮流输出        println(name)        println(age)    }}

apply关键字

data class Person(val name:String,val age:Int){    fun work(){        println("$name is working!!!")    }}fun findPerson():Person?{    return Person("张三",20)}fun main(args: Array<String>) {    findPerson()?.apply {        work()        println(name)    }}

run 关键字

run函数和apply函数很像,只不过run函数是使用最后一行的返回,apply返回当前自己的对象。

fun testRun() {    // fun <T, R> T.run(f: T.() -> R): R = f()    "testRun".run {        println("this = " + this)    }.let { println(it) }}// 运行结果// this = testRun// kotlin.Unit

with 关键字

fun main(args: Array<String>) {    val br = BufferedReader(FileReader("hello.txt"))    with(br){        while (true){            val line:String = readLine()?:break            println(line)        }        close()    }}

use关键字

    BufferedReader(FileReader("hello.txt")).use {        var line:String?        while (true){            line = it.readLine()?:break            println(line)        }    }

user 内部的释放

public inline fun <T : Closeable?, R> T.use(block: (T) -> R): R {    var closed = false    try {        return block(this)    } catch (e: Exception) {        closed = true        try {            this?.close()        } catch (closeException: Exception) {        }        throw e    } finally {        if (!closed) {            this?.close()        }    }}
原创粉丝点击