kotlin:2 lambda参数的语法

时间:2018-01-11 13:54:37

标签: java lambda syntax kotlin kotlin-interop

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

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

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

nowm in kotlin,我正在尝试使用2个参数调用该版本(如java中所示):

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

但是我收到了编译错误。

  

Kotlin:意外的令牌(使用';'在同一行上分隔表达式)

正确的语法是什么?

3 个答案:

答案 0 :(得分:5)

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

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

请参阅:Lambda Expression Syntax

答案 1 :(得分:4)

你很亲密,你只需用花括号包裹它们......

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

此外,您可以利用Kotlin将it定义为lambda的默认单个参数这一事实。假设键和值都是字符串,并且您想要反转键和大写值(只是构成一个例子):

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

答案 2 :(得分:1)

基本语法:Lambda表达式始终用大括号括起来:

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

实施例

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

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

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

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

此外,知道如果lambda是传递给函数的最后一个参数,它可以被解除掉这样的parantheses,这很好:

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

第一个lambda是在parantheses内部传递的,而第二个lambda是不是。