kotlin-拉姆达表达式

342 阅读1分钟

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