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
}
Первая лямбда проходит внутри парантезов, а вторая - нет.