kotlin: синтаксис для 2 лямбда-параметров

Я новичок в котлине. У меня есть класс Java с 2 перегруженными методами. Один принимает одну функцию, другой принимает две

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

а также

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

Сейчас я в Котлине, я пытаюсь вызвать версию с 2 параметрами (как в Java):

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

но я получаю ошибку компиляции.

Kotlin: неожиданные токены (используйте ';' для разделения выражений в одной строке)

какой правильный синтаксис?

3 ответа

Решение

В Kotlin лямбда-выражения всегда заключены в фигурные скобки, поэтому

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

Смотрите: Синтаксис лямбда-выражений

Вы были близки, вы просто должны обернуть их в фигурные скобки...

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

Кроме того, вы можете воспользоваться тем, что Котлин определяет it в качестве единственного параметра по умолчанию для лямбды. Предполагая, что ключ и значение оба являются строками, вы хотите повернуть ключ и значение в верхнем регистре (просто составив пример):

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

Основной синтаксис: лямбда-выражения всегда заключены в фигурные скобки:

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

пример

Давайте определим функцию, аналогичную вашей в Kotlin:

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

Первая возможность - прямо, мы просто пропускаем две лямбды следующим образом:

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

Кроме того, полезно знать, что если лямбда является последним аргументом, передаваемым функции, она может быть удалена из следующих разделов:

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

Первая лямбда проходит внутри парантезов, а вторая - нет.

Другие вопросы по тегам