kotlin 常用高階函式
阿新 • • 發佈:2019-01-01
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>) { }