Kotlin 匿名函数的问题

2020-04-16 01:00:35 +08:00
 TxcA
    val numbers1 = mutableListOf(0, 1, 2, 3, 4)
    val numbers2 = mutableListOf(5, 6, 7, 8, 9)
    println("numbers : ${numbers1.zip(numbers2) { a, b -> a + b }}")
    println("numbers add {} : ${numbers1.zip(numbers2) { a, b -> { a + b } }}")

    //println
    //numbers : [5, 7, 9, 11, 13]
    //numbers add {} : [() -> kotlin.Int, () -> kotlin.Int, () -> kotlin.Int, () -> kotlin.Int, () -> kotlin.Int]

今天无意遇到一个问题,使用 zip 时一直报 null,检查好久后才发现多了一个花括号。 看了半天始终没明白,为什么匿名函数内多加一个花括号会导致返回 Unit?

2971 次点击
所在节点    Kotlin
6 条回复
fansangg
2020-04-16 01:24:33 +08:00
百度一下闭包
maninfog
2020-04-16 02:55:02 +08:00
确保 3 点
1.lamda 表达式会默认返回最后一个表达式的值,并推导类型,比如 a+b 就是一个表达式,结果是 Int,所以 kotlin 推导出值是 Int 类型。
2.{a +b}就不是 Int 类型了,它也是一个 lamda 表达式,类型应该是一个()->Int 的函数类型,所以这里编译器推导出类型为()->Int 。
3.既然用了 kotlin 就不要用 java 的 lambda 的写法了,两者不一样
kmyzzy
2020-04-16 04:55:54 +08:00
a+b 的类型是 int ;{ a + b } 的类型是 Unit
TxcA
2020-04-16 08:02:18 +08:00
@fansangg 感谢,
TxcA
2020-04-16 08:02:59 +08:00
@maninfog 感谢,大概理解了。
TxcA
2020-04-16 08:03:11 +08:00
@kmyzzy 感谢,

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/662901

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX