kotlin 函数和 Lambda 表达式

1 尾递归函数
tailrec 修饰符标记

函数必须将其自身作为它执调用的最后一个个操作。

不能再try/catch/finally 块中使用

tailrec fun findFixPoint(x: Double = 1.0): Double
= if (x == Math.cos(x)) x else findFixPoint(Math.cos(x))

2 高阶函数和lambda 表达式

高阶函数是将函数用作参数或返回值的函数。

--lambda 表达式总是被括号括着,

--其参数(如果有的话)在 -> 之前声明(参数类型可以省略),

--函数体(如果存在的话)在 -> 后面。

3 在 Kotlin 中有个约定,如果函数的最后一个参数是函数,并且你传递lambda表达式作为相应的参数,你可以在圆括号之外指定它;
如果 lambda 是该调用的唯一参数,则调用中的圆括号可以完全省略。

fun  List.map(transform: (T) -> R): List {
    val result = arrayListOf()
    for (item in this)
        result.add(transform(item))
    return result
}

val doubled = ints.map { value -> value * 2 }

4 it:单个参数的隐式名称

如果函数字面值只有一个参数, 那么它的声明可以省略(连同 -> ),其名称是it。

5 下划线用于未使用的变量

如果 lambda 表达式的参数未使用,那么可以用下划线取代其名称:

map.forEach { _, value -> println("$value!") }

6 可以使用限定的返回语法从 lambda显式返回一个值。否则,将隐式返回最后一个表达式的值

7 匿名函数

fun(x: Int, y: Int): Int = x + y
相当于
fun(x: Int, y: Int): Int {
return x + y
}

匿名函数参数总是在括号内传递。 允许将函数 留在圆括号外的简写语法仅适用于 lambda 表达式。

8 闭包
Lambda 表达式或者匿名函数(以及局部函数和对象表达式) 可以访问其闭包,即在外部作用域中声明的变量。
与 Java 不同的是可以修改闭包中捕获的变量:

var sum = 0
ints.filter { it > 0 }.forEach {
sum += it
}
print(sum)

9 带接收者的函数字面值
这样的函数字面值的类型是一个带有接收者的函数类型:

sum : Int.(other: Int) -> Int

//该函数字面值可以这样调用:

你可能感兴趣的:(kotlin 函数和 Lambda 表达式)