1. 程式人生 > >kotlin 常用高階函式

kotlin 常用高階函式

package kotlinall.chapter5

import java.io.BufferedReader
import java.io.FileReader
import java.lang.StringBuilder

//高階函式 傳入的引數是函式 或者返回是函式
class Hello{
    fun world(){
        println("Hello World")
    }
}
fun test(){

}
class PdfPrinter{
    fun println(any:Any){
        kotlin.io.println(any)
    }
}
//高階函式基礎
fun baseFun(vararg args:String){
    //1.引用類裡面的函式
    val hellowrold = Hello::world//拿到函式的引用
    args.filter(String::isNotEmpty)//接收的函式型別 T型別的引數 返回boolean值的函式 isNotEmtpy有一個隱形的引數就是String例項本身

    //2.引用包級函式 直接::函式名稱
    val print1 = ::test

    //3.引用呼叫者的函式
    val pdfPrinter:PdfPrinter = PdfPrinter()
    args.forEach(pdfPrinter::println)//
    args.forEach(::println)
}

//常見高階函式
fun commonFun(){
    val list = listOf<Int>(1,2,3,4,5)
    val newList = ArrayList<Int>()
    list.forEach{
        val newElement = 2*it + 3
        newList.add(newElement)
    }
    newList.forEach(::println)

    val newList1 = list.map { it*2+3 }//map 對每一個值進行處理新增一個新的list裡面返回
    val newList2 = list.map { it.toDouble() }
    val newList3 = list.map(Int::toDouble)//採用函式引用的方式去傳遞 因為使用類的例項呼叫 所以有一個預設例項的引數

    val list4 = listOf(1..20,2..5,100..322)
    val flatList1 = list4.flatMap{//把集合的集合打平 可以對集合裡的元素繼續進行map
        it
    }
    val flatList = list4.flatMap{//把集合的集合打平 可以對集合裡的元素繼續進行map
        it.map {
            "NO.$it"
        }
    }
    flatList.forEach(::println)

    //
    flatList1.reduce { acc, i -> acc+i }//acc 當前運算結果 和當前元素的值
    (0..6).map(::factorial) //列印0,6的 階乘的值
    //給reduce acc 新增初始值
    flatList1.fold(5){acc,i->acc+i}
    //redule acc 必須是 flatList迭代元素型別的父類
    //fold acc可以傳入任意型別
    flatList1.fold(StringBuilder()){acc,i->acc.append(i).append(",")}
    println((0..6).joinToString(","))//拼接字串

    flatList1.foldRight(StringBuilder()){i,acc->acc.append(i).append(",")}//倒敘拼接

    (0..6).map(::factorial).filter {
        it %2 ==1
    } //列印0,6的 階乘的值 過濾出基數的值

    (0..6).map(::factorial).filterIndexed { index, i ->index%2==1  }//奇數位的結果
    (0..6).map(::factorial).takeWhile {  it%2==0}//取到第一個不是偶數則終止條件 (取到一個不滿足條件的 終止迴圈)



}

fun factorial(n:Int):Int{
    if(n == 0) return 1
    return (1..n).reduce { acc, i ->acc*i  }
}

class Person(val name:String,val age:Int){
    fun work(){
        println("$name is wroking")
    }
}
fun findPerson():Person?{
    return null
}
fun commonFun1(){
     val person = findPerson()
     println(person?.name)//不為空則列印name 空顯示空字串
    findPerson()?.let { //不為空則呼叫let
        println(it.name)
        println(it.age)
    }
    findPerson()?.apply { //apply 相當於處於person類中 可以直接呼叫方法 和欄位
        work()
        println(age)
    }
     val br = BufferedReader(FileReader("hello.txt"))
    with(br){//with 接收一個引數 作為apply使用
        var line:String?
        while (true){
            line = readLine()?:break
            println(line)
        }
        close()
    }
    val br1 = BufferedReader(FileReader("hello.txt")).readText()
    BufferedReader(FileReader("hello.txt")).use {//對於需要close的 使用的模板方法 可以使用use去處理
        var line:String?
        while (true){
            line = it.readLine()?:break
            println(line)
        }
    }

}

fun main(args: Array<String>) {

}