8. Kotlin---函数与Lambda表达式

Kotlin
函数

Kotlin中的函数使用fun关键字声明。

const val str1: String = "10";
const val str2: String = "20";

fun main() {

    val number = sum(str1.toInt(), str2.toInt()); // toInt(): 类型转换为Int
    println("number is $number"); // number is 30

    println(sum2(100, 300)); // 400

}

// 定义函数
fun sum(arg1: Int, arg2: Int): Int {
    return arg1 + arg2;
}

// 匿名函数
val sum2 = fun(arg1: Int, arg2: Int): Int {
    return arg1 + arg2;
}

// 返回无意义
fun sum03(): Unit {
    println("无意义!!!");
}

// 单表达式函数
fun double(x: Int): Int = x * 2;
Lambda介绍

Lambda表达式与匿名函数是函数字面值,即未声明的函数,但立即作为表达式传递。

Lambda表达式的本质其实是匿名函数,因为在其底层实现中还是通过匿名函数来实现的。

Lambda作为函数式编程的基础,其语法也是相当简单的。

max(strings,{a,b -> a.length < b.length})

函数max是一个高阶函数,接受一个函数作为第二个参数。其第二个参数是一个表达式,它本身是一个函数,即函数字面值。

Lambda表达式语法
val sum: (Int, Int) -> Int = { x: Int, y: Int -> x + y }

Lambda表达式总是括在花括号中,完整语法形式的参数声明放在花括号内,并有可选的类型标注,函数体跟在一个->符号之后。如果推断出的该Lambda的返回类型不是Unit,那么该Lambda主体中的最后一个表达式会视为返回值。

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

Kotlin中有一个约定:如果函数的最后一个参数是函数,那么作为相应参数传入的Lambda表达式可以放在圆括号之外

val product = items.fold(1) { acc, e -> acc * e }
fun max(strings:String) {a:Int,b:Int -> a.length < b.length}

这种语法也称为拖尾Lambda表达式

it
  • it是在当一个高阶函数中Lambda表达式的参数只有一个的时候可以使用it来使用此参数。it可表示为单个参数的隐式名称,是Kotlin语言约定的。
val array:Array<Int> = arrayOf(1,2,3,4,5,6);

fun main() {
    println(array.filter {i: Int -> i < 3 }); // [1, 2]
    println(array.filter { it <= 3 }); // [1, 2, 3]
    println(array.filter { it < 5 }.component1()); // 1, component1: 从集合中返回第一个element
}

注意:

println(array.filter {(i: Int) -> i < 3 }); // (i: Int):加括号是错误的

推荐阅读更多精彩内容