9

我是科特林的新手。我有一个带有 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:意外标记(使用 ';' 分隔同一行上的表达式)

什么是正确的语法?

4

3 回答 3

15

在 Kotlin 中,lambda 表达式总是被花括号包围,所以它是

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

请参阅:Lambda 表达式语法

于 2018-01-11T13:57:22.460 回答
4

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

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

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

myClass.mapToEntry( { it.reversed() }, { it.toUpperCase() })
于 2018-01-11T14:00:26.907 回答
2

基本语法: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 在括号内传递,而第二个不是。

于 2018-01-11T18:33:14.750 回答