Kotlin调用lambda表达式时,lambda中的参数名字省略问题

先说结论:

如果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)}

 

posted @ 2020-10-09 16:12  SoClear  阅读(496)  评论(0编辑  收藏  举报