先说结论:
如果lambda表达式只有一个参数,那么在调用该lambda表达式时,可以不指定它的参数名字.在lambda函数体内用it来代表这个参数.
如果lambda表达式有多个参数,那么在调用该lambda表达式时,必须指定每一个参数的名字.
1 fun main() { 2 /* 3 如果lambda表达式只有一个参数,那么在调用该lambda表达式时,可以不指定它的参数名字.在lambda函数体内用it来代表这个参数. 4 如果lambda表达式有多个参数,那么在调用该lambda表达式时,必须指定每一个参数的名字. 5 */ 6 7 test1(5) { println("test1 没有it") } 8 //引用 9 test1(5,::test0) 10 println("------------------------------") 11 12 13 test2(6) { println("test2 it=$it") } 14 test2(6,::test00) 15 println("------------------------------") 16 17 18 test3(3, 2) { println("test3 it=$it") } 19 test3(22,33){a -> println("test3 a=$a 有a就没有it了")} 20 println("------------------------------") 21 22 test4(22,33){a,b -> 23 println("test4 a=$a b=$b 没有it") 24 } 25 test4(22,33){a,b -> 26 println("test4 a=$a b=$b 没有it a-b=${a-b}") 27 } 28 test4(22,33){_,b -> 29 println("test4 省略a,只有b=$b 没有it") 30 } 31 //如果lambda表达式有两个及以上参数,那么即使lambda表达式的全部的参数都用不到,也不能省略"_,_ -> " 32 test4(3,4){ _,_ -> 33 println("test4 省略a和b 没有it") 34 } 35 //下面这样写是错误的.如果lambda表达式有两个及以上参数,那么任一参数都要用合法字符串或者_来表示,即使全都用不到也要用相应个数个_代替, 36 // test4(3,4){ println("test4")} 37 test4(1,2,::test000) 38 println("------------------------------") 39 40 test5 { println("test5 it=$it") } 41 test5 { a -> println("test5 it=$a") } 42 //lambda表达式只有一个参数,如果使用" _ -> 函数体 "这种方式来省略的话, 那么"_ ->"是多余的,应该去掉 43 test5 { _ -> println("test5") } 44 45 46 } 47 48 49 private fun test0(){println("test0")} 50 private fun test00(x:Int){println("test00")} 51 private fun test000(x:Int,y:Int){println("test000 x+y=${x+y}")} 52 53 private fun test1(x: Int, action: () -> Unit) { 54 action() 55 } 56 57 private fun test2(x: Int, action: (Int) -> Unit) { 58 action(x) 59 } 60 61 private fun test3(x: Int, y: Int, action: (Int) -> Unit) { 62 action(x) 63 } 64 65 private fun test4(x: Int, y: Int, action: (Int, Int) -> Unit) { 66 action(x, y) 67 } 68 69 private fun test5(action: (Int) -> Unit){action(666)}