Большинство проблем здесь связано с лямбда-синтаксисом Kotlin, который немного отличается от синтаксиса некоторых других языков.
В Kotlin у лямбды должны быть фигурные скобки.Но ->
является необязательным в некоторых случаях (если лямбда не принимает параметров; или если она принимает один, и вы ссылаетесь на него с фиктивным именем it
).
Это одна из причин, почемуваша первая версия не работает;для этого нужно было бы переместить s ->
внутрь скобок.(Другое - это то, что в Kotlin назначение не является выражением и не возвращает значение, поэтому вы не можете использовать его в return
.)
Ваш второй работает, потому что в Kotlin, еслипоследний параметр - лямбда, его можно переместить за скобки.(Это позволяет использовать функции высшего порядка, которые выглядят как синтаксис языка. На самом деле, если лямбда - это параметр only , вы можете полностью опустить скобки!)
Я не знаюLiveData, но мне интересно, правильно ли работает return@map
: он вернется не только из лямбды, но и из самого метода map()
.(Такие нелокальные возвраты не требуются очень часто и могут вводить в заблуждение.)
Кроме того, лямбда не нуждается в явном return
;он возвращает значение своего последнего выражения.
Так что я подозреваю, что более краткая версия будет:
Transformations.map(localLiveData) { it.name = "Hi"; it }