8. Kotlin---函数与Lambda表达式
2019-11-07 本文已影响0人
努力生活的西鱼
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):加括号是错误的