Lambda表达式,匿名函数,高阶函数——Kotlin

原文出处:https://kotlinlang.org/docs/reference/lambdas.html#higher-order-functions
挑选了原文中的高阶函数,Lambda表达式和匿名函数两个小章节。

高阶函数
高阶函数可以将函数作为参数,或者可以返回一个函数作为返回值。

这有一个关于集合的例子,有两个参数,初始累积值和组合函数,通过将当前累积值和每个集合元素组合,替换累积值。
在这里插入图片描述
上面的代码中,参数combine的函数类型是*(R, T) -> R*,那么它的两个参数类型是RT,返回值类型是Rcombine是通过在for-loop里面触发的,combine的返回值赋值给accumulator
为了调用fold,我们需要传入一个函数类型的参数,lambda表达式作为参数广泛应用于高阶函数调用中。
在这里插入图片描述
再举一个例子(这个例子不是原文中的,出处已经找不到了)。函数compose的两个参数都是函数类型,并且返回值也是函数类型。compose和我们数学概念上的函数更加接近f(g(x))。
在这里插入图片描述

Lambda表达式和匿名函数

Lambda表达式和匿名函数是“字面函数(function literals)”,也就是函数没有被申明,但可以立即作为表达式传递。看下面这个例子:
在这里插入图片描述
函数max是一个高阶函数,第二个参数是一个函数,并且第二个参数是一个表达式,这个表达式自身就是一个函数,也就是这个函数在字面上等价于下面这个函数
在这里插入图片描述
Lambda表达式句法
Lambda表达式的完整句法形式如下:
在这里插入图片描述
Lambda表达式总是被大括号括起来,在完整句法形式下,参数的申明在大括号里,类型注释可选,函数体在符号 ->后面。如果Lambda表达式的推断的返回类型不是Unit,在Lambda表达式中最后(或者可能只有一行)的表达式被作为返回值。

如果我们移除所有的类型注释,就变成下面这个样子了:
在这里插入图片描述

传递Lambda表达式给最后一个参数

Kotlin有一个规范,如果一个函数接收一个函数作为最后一个参数,作为参数传递的Lambda表达式可以放在括号外:
在这里插入图片描述
如果Lambda表达式是唯一的参数,括号可以完全省略:
在这里插入图片描述
it: 一个参数的隐式名称。

仅有一个参数的Lambda表达式是非常常见的。

如果编译器自己能够找出签名,唯一的参数就可以不用申明并且省略掉->。该参数将隐式的以it命名:
在这里插入图片描述

从Lambda表达式返回一个值

我们可以显示地使用return从Lambda返回一个值,另外最后一个表达式的值隐式地作为返回值。
在这里插入图片描述

匿名函数

上面介绍的Lambda表达式语法中缺少了对指定返回类型的介绍。大部分情况下,这是没有必要的,因为返回类型可以自动推断出来。如果你需要显示的指明,你可以使用另一个句法:匿名函数
在这里插入图片描述
匿名函数非常像常规函数的申明,只是没有名字。函数体可以是表达式(像上面)或者块:
在这里插入图片描述
参数和返回类型和常规函数的申明方式是一样的,但是如果参数类型可以通过上下文推断出来,那么可以省略:
在这里插入图片描述
匿名函数返回类型的推断和正常函数是一致的,对于具有表达式的匿名函数的返回值类型是自动推断的,对于具有块的匿名函数,返回类型需要显示地指定。

需要注意的是,匿名函数的参数总是在括号里传递。允许将函数放在括号外的简写语法仅适用于Lambda表达式。

Lambda表达式和匿名函数的另一个不同点是*non-local return的行为。没有标签的返回语句总是从带有fun*关键字申明的函数返回。这意味着Lambda表达式中的返回值将从闭函数返回,而匿名函数中的返回值将从匿名函数本身返回(可以参考non-local return的解释https://kotlinlang.org/docs/reference/inline-functions.html#non-local-returns)。

猜你喜欢

转载自blog.csdn.net/diangangqin/article/details/83269562
今日推荐