Kotlin Lambda表达式,高阶函数
在本教程中,我们将详细研究kotlin高阶函数和lambda表达式。
同时,我们还将探讨函数引用,匿名函数和闭包。
Kotlin高阶函数
Kotlin支持功能编程。
高阶函数可以将函数作为参数传递或者将其用作返回值。
让我们通过示例来看一下。
函数类型和引用
Kotlin中的函数是类型。()-> String
是不带参数且返回字符串的类型。(String)-> String
是一种接受字符串参数并返回字符串参数的类型。
Kotlin Lambda表达式
Lambda表达式是函数文字,可以帮助我们以简短的方式编写函数。
它们为我们提供了一种紧凑的代码编写方式。
让我们定义一个lambda表达式以查看函数如何充当类型。
fun main(args: Array<String>) { var lambdaFunction :(String)->Unit = {s:String -> println(s)} lambdaFunction("Kotlin Lambda Functions") //or lambdaFunction = {println(it)} lambdaFunction("Kotlin Lambda Functions Concise") val noArgFunction : () -> Unit ={ println("Another function")} noArgFunction() } //Following is printed on the console. //Kotlin Lambda Functions //Kotlin Lambda Functions Concise //Another function
LambdaFunction属性具有其类型的功能。
右侧是函数的声明位置。
它用于访问lambda表达式主体中的参数值。
我们也可以使用引用将函数作为参数传递给另一个函数,如下所示。
这样的功能被称为高阶功能。
fun main(args: Array<String>) { var printFunction: (String) -> Unit = { println(it) } functionReferencesExample("theitroad.local", printFunction) } fun functionReferencesExample(str: String, expression: (String) -> Unit) { print("Welcome To Kotlin Series @") expression(str) }
要将一个函数作为参数传递给另一个函数,我们需要使用符号:::。
以下代码段在同一示例上演示了一个示例。
fun main(args: Array<String>) { functionReferencesExample("theitroad.local", ::printFunction) } fun functionReferencesExample(str: String, expression: (String) -> Unit) { print("Welcome To Kotlin Series @") expression(str) } fun printFunction(str: String) { println(str) }
注意:我们将在以后的教程中详细介绍高阶函数和lambda表达式。
高阶函数中的Lambda表达式
Lambda表达式可以在高阶函数参数中传递,如下所示。
fun main(args: Array<String>) { printMe({ println("Lambda Inside a function")}) //prints Lambda Inside a function } fun printMe(string1: () -> Unit) { string1() }
lambda表达式作为参数在另一个函数中作为函数运行。
另一个示例演示在print函数内部使用lambda表达式。
fun main(args: Array<String>) { println("Let's invoke a lambda function ${returnMe { "return Me " + "function" }} here") } fun returnMe(string: ()->String) : String { return string() } //Prints //Let's invoke a lambda function return Me function here
类型别名
Typealiases为类型提供了备用名称。
不用每次在定义属性时都键入函数类型,而是可以使用如下所示的typealias
。
fun main(args: Array<String>) { var printFunction: MyFirstAlias = { println(it) } } typealias MyFirstAlias = (String)->Unit typeAlias Username = String
这无疑提高了代码的可读性。
异常函数
我们已经看到,lambda表达式无法明确指定返回类型,如下所示。
var sum = { a: Int, b: Int -> a + b } var result = sum(2,3) //result is an int 5
为了显式设置返回类型,我们可以使用Annoymous函数。
功能不佳的函数不需要名称。
fun main(args: Array<String>) { //Defining val annoSum = fun(x: Int, y: Int): Int = x + y //Invoking print(annoSum(2,3)) //5 }
如果未定义匿名函数的参数/返回类型,则可以像普通函数一样进行推断。
让我们在标准库高阶函数中使用匿名函数。
var myList = listOf<Int>(1,2,5,7,6,10) myList = myList.filter(fun(item) = (item%2 ==0) ) println(myList)
filter是一个高阶函数,它检查每个列表项上的给定条件。
在上面的代码中,它检查每个列表整数元素的奇/偶数。
注意:有很多标准库函数。
我们将在以后的教程中研究它们以及用例。
Kotlin封盖
闭包是可以访问和修改在函数范围之外定义的属性的函数。
下面的闭包函数是一个高阶函数,它计算列表中所有元素的总和并更新在闭包外部定义的属性。
var res = 0 myList = listOf(1,2,3,4,5,6,7,8,9,10) myList.forEach { res+=it } println(res) //prints 55