V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
TxcA
V2EX  ›  Kotlin

Kotlin 匿名函数的问题

  •  
  •   TxcA · 2020-04-16 01:00:35 +08:00 · 2962 次点击
    这是一个创建于 1682 天前的主题,其中的信息可能已经有所发展或是发生改变。
        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?

    fansangg
        1
    fansangg  
       2020-04-16 01:24:33 +08:00
    百度一下闭包
    maninfog
        2
    maninfog  
       2020-04-16 02:55:02 +08:00 via iPhone
    确保 3 点
    1.lamda 表达式会默认返回最后一个表达式的值,并推导类型,比如 a+b 就是一个表达式,结果是 Int,所以 kotlin 推导出值是 Int 类型。
    2.{a +b}就不是 Int 类型了,它也是一个 lamda 表达式,类型应该是一个()->Int 的函数类型,所以这里编译器推导出类型为()->Int 。
    3.既然用了 kotlin 就不要用 java 的 lambda 的写法了,两者不一样
    kmyzzy
        3
    kmyzzy  
       2020-04-16 04:55:54 +08:00
    a+b 的类型是 int ;{ a + b } 的类型是 Unit
    TxcA
        4
    TxcA  
    OP
       2020-04-16 08:02:18 +08:00
    @fansangg 感谢,
    TxcA
        5
    TxcA  
    OP
       2020-04-16 08:02:59 +08:00
    @maninfog 感谢,大概理解了。
    TxcA
        6
    TxcA  
    OP
       2020-04-16 08:03:11 +08:00
    @kmyzzy 感谢,
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2824 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 09:25 · PVG 17:25 · LAX 01:25 · JFK 04:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.