高阶函数的使用:
package com.init.demo.test fun main(args: Array<String>) { /** * 高阶函数是一个接受一个函数类型的函数 * 高阶函数是一个返回一个函数类型的值 */ val cc = arrayOf(1, 2, 3, 4, 5) val dd = cc.filter { it > 3 } /** * { it > 3 }是一个lambda表达式 作为filter 唯一的也是最后一个的参数调用可以省略圆括号 * it代表array中的每一个元素: * filter函数源码:public inline fun <T> Array<out T>.filter(predicate: (T) -> Boolean): List<T> { * return filterTo(ArrayList<T>(), predicate) * } * filterto函数源码 : public inline fun <T, C : MutableCollection<in T>> Array<out T>.filterTo(destination: C, predicate: (T) -> Boolean): C { * for (element in this) if (predicate(element)) destination.add(element) * return destination } */ println(dd) val ee = arrayOf("Aa", "bB", "Cc", "cccc") val ff = ee.filter { it.contains("c") } println(ff) println("*****************************************************顶层函数的引用*****************************************") fun isEven(a: Int) = a % 2 == 0 //注意:“::”一元操作符要写在函数名之前,花括号要改成函数正式调用的圆括号 val dd1 = arrayOf(1, 2, 3, 4, 5).filter { isEven(it) } val gg = arrayOf(1, 2, 3, 4, 5).filter(::isEven) println(dd1) println(gg) println("dd1和gg是否等阶:" + (dd1 == gg)) println("*****************************************************成员函数和扩展函数的引用*****************************************") //使用函数引用的好处是可以简化写法,利用已有的函数省略参数,常规完整写法 var valueMin1 = comboTwoValue2(1, -3) { a, b -> Math.min(a, b) } println(valueMin1) //简化写法,这里的min属于Math类的成员函数 var valueMin2 = comboTwoValue2(-1, 3, Math::min) println(valueMin2) //扩展函数简单引用 fun Int.isOdd() = this % 1 == 0 //可以向成员函数那样引用扩展函数 val allOldNumbers = arrayOf(5,4,3).filter (Int::isOdd) println(allOldNumbers) val ee1 = arrayOf("Aa", "bB", "Cc", "cccc") val x = ee1.filter ("Cc"::equals) println(x) } fun comboTwoValue2(x: Int, y: Int, method: (a: Int, b: Int) -> Int): Int { return method(x, y) }
输出:
[4, 5][Cc, cccc]
*****************************************************顶层函数的引用*****************************************
[2, 4]
[2, 4]
dd1和gg是否等阶:true
*****************************************************成员函数和扩展函数的引用*****************************************
-3
-1
[5, 4, 3]
[Cc]