【问题标题】:kotlin: syntax for 2 lambda parameterkotlin:2 lambda 参数的语法
【发布时间】:2018-01-11 13:54:36
【问题描述】:

我是 kotlin 的新手。我有一个带有 2 个重载方法的 java 类。一个接受一个函数,另一个接受两个

mapToEntry(Function<? super T, ? extends V> valueMapper)

mapToEntry(Function<? super T, ? extends K> keyMapper, 
           Function<? super T, ? extends V> valueMapper)

现在在 kotlin 中,我正在尝试使用 2 个参数调用版本(如在 java 中):

myClass.mapToEntry(r -> r, r -> r)

但我得到编译错误。

Kotlin:意外标记(使用 ';' 分隔同一行中的表达式)

正确的语法是什么?

【问题讨论】:

    标签: java lambda syntax kotlin kotlin-interop


    【解决方案1】:

    在 Kotlin 中,lambda 表达式总是用花括号括起来,所以它是

    myClass.mapToEntry({ r -> r }, { r -> r })
    

    见:Lambda Expression Syntax

    【讨论】:

      【解决方案2】:

      你已经很接近了,你只需要用花括号将它们包裹起来......

      myClass.mapToEntry({r -> r}, {r -> r})
      

      此外,您可以利用 Kotlin 将 it 定义为 lambda 的默认单个参数这一事实。假设key和value都是String,你想把key颠倒过来,把value大写(只是举个例子):

      myClass.mapToEntry( { it.reversed() }, { it.toUpperCase() })
      

      【讨论】:

        【解决方案3】:

        基本语法:Lambda 表达式总是用大括号括起来:

        val sum = { x: Int, y: Int -> x + y }
        

        示例

        让我们在 Kotlin 中定义一个类似于你的函数:

        fun <T, K> mapToEntry(f1: (T) -> K, f2: (T) -> K) {}
        

        第一个可能是直截了当的,我们只需传递两个 lambda,如下所示:

        mapToEntry<String, Int>({ it.length }, { it.length / 2 })
        

        此外,很高兴知道如果 lambda 是传递给函数的最后一个参数,则可以像这样将其从括号中取出:

        mapToEntry<String, Int>({ it.length }) {
            it.length / 2
        }
        

        第一个 lambda 在括号内传递,而第二个不是。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多