lamuda表达式标准用法
val sum = { x: Int, y: Int -> x + y }复制代码
下面通过几个更复杂的例子说明,lamuda表达式的几种用法
1."-,"表示参数未使用
map.forEach { _, value -> println("$value!") }复制代码
2.大多数lamuda不会返回数据类型,除了匿名函数类(和普通函数不同,匿名函数不需要申明)
fun(x: Int, y: Int): Int = x + y复制代码
也可以式下面表示
fun(x: Int, y: Int): Int { return x + y}复制代码
匿名函数类和lamuda区别:匿名函数类只能在括号内传递,lamuda可以在括号外。如:
ints.filter(fun(item) = item > 0)复制代码
注:在 Kotlin 中有一个约定:如果函数的最后一个参数接受函数,那么作为相应参数传入的 lambda 表达式可以放在圆括号之外:
val product = items.fold(1) { acc, e -> acc * e }复制代码
如果该 lambda 表达式是调用时唯一的参数,那么圆括号可以完全省略:
run { println("...") }复制代码
3.带有接收者的函数类型,例如 A.(B) -> C
复制代码
4.取别名
typealias ClickHandler = (Button, ClickEvent) -> Unit复制代码
5.运行规则:从右到左,可为空
如需将函数类型指定为可空,请使用圆括号:((Int, Int) -> Int)?。函数类型可以使用圆括号进行接合:(Int) -> ((Int) -> Unit)箭头表示法是右结合的,(Int) -> (Int) -> Unit 与前述示例等价,但不等于 ((Int) -> (Int)) -> Unit。复制代码
6.函数类
class IntTransformer: (Int) -> Int { override operator fun invoke(x: Int): Int = TODO()}val intFunction: (Int) -> Int = IntTransformer()复制代码
val stringPlus: (String, String) -> String = String::plus复制代码
7.max是高阶函数,下面两个是等价
max(strings, { a, b -> a.length < b.length })复制代码
fun compare(a: String, b: String): Boolean = a.length < b.length复制代码