Kotlin: Написание больших лямбд, похожих на Java? - PullRequest
1 голос
/ 26 марта 2020

В Java это можно сделать ->

someList.stream().map(x -> {
    y = doSomeOperation(x);
    z = doSomeOtherOperation(y);
    return z;
}).collect(Collectors.toList());

Мне нужно преобразовать приведенный выше код в Kotlin. Но во всех онлайн-уроках я узнаю, что возможно иметь только простые лямбды, такие как x -> x*x или x->doSomethingThenReturnValue(x).

Разве невозможно написать сложную лямбду (которая делает некоторые сложные встроенные операция) как выше в kotlin? Я пытался написать ->

someList.map{ x -> {
    y = doSomeOperation(x);
    z = doSomeOtherOperation(y);
    return z;
}}

Но выкинуло ошибку. Подскажите, пожалуйста, как правильно это сделать?

Ответы [ 2 ]

2 голосов
/ 26 марта 2020

Я думаю, что проблема здесь return z. При помещении внутрь лямбды он возвращается из функции включения, в отличие от Java, где он возвращается только из самой лямбды. Таким образом, вы должны написать

someList.map { x -> 
    y = doSomeOperation(x)
    z = doSomeOtherOperation(y)
    z
}

или

someList.map { x -> 
    y = doSomeOperation(x)
    z = doSomeOtherOperation(y)
    return@map z
}

Более подробную информацию о проблеме «возврата» можно найти здесь - https://kotlinlang.org/docs/reference/returns.html

2 голосов
/ 26 марта 2020

Вы написали слишком много скобок. В kotlin определение параметра для лямбды задается в скобках (см. справочная документация ).

EDIT : Кроме того, выражение возврата в лямбдах не всегда разрешено и когда это так, его поведение действительно задается c. Больше информации в официальной документации . Итак, ваш пример должен быть переписан следующим образом:

someList.map { x -> 
    val y = doSomeOperation(x)
    val z = doSomeOtherOperation(y)
    // z implicitely returned as lambda result
    z
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...