Преобразование карты LiveData в котлин - PullRequest
0 голосов
/ 03 мая 2019

Transformations.map в преобразованиях LiveData принимает два аргумента:

  1. @ Ненулевой источник LiveData
  2. @ NonNull final Функция func

Я попытался сделать такую ​​функцию:

val localLiveData = #some live data of type LiveData<User>
Transformations.map(localLiveData, s->{return s.name = "Hi"})

но это показывает, что ошибка не может быть разрешена "s"

наконец-то у меня получилось так:

Transformations.map(localLiveData) {
              s.name = "Hi"
                return@map s
            }

Как у этой штуки работает карта, имеет только один аргумент? (нуб в котлине)

1 Ответ

0 голосов
/ 03 мая 2019

Большинство проблем здесь связано с лямбда-синтаксисом Kotlin, который немного отличается от синтаксиса некоторых других языков.

В Kotlin у лямбды должны быть фигурные скобки.Но -> является необязательным в некоторых случаях (если лямбда не принимает параметров; или если она принимает один, и вы ссылаетесь на него с фиктивным именем it).

Это одна из причин, почемуваша первая версия не работает;для этого нужно было бы переместить s -> внутрь скобок.(Другое - это то, что в Kotlin назначение не является выражением и не возвращает значение, поэтому вы не можете использовать его в return.)

Ваш второй работает, потому что в Kotlin, еслипоследний параметр - лямбда, его можно переместить за скобки.(Это позволяет использовать функции высшего порядка, которые выглядят как синтаксис языка. На самом деле, если лямбда - это параметр only , вы можете полностью опустить скобки!)

Я не знаюLiveData, но мне интересно, правильно ли работает return@map: он вернется не только из лямбды, но и из самого метода map().(Такие нелокальные возвраты не требуются очень часто и могут вводить в заблуждение.)

Кроме того, лямбда не нуждается в явном return;он возвращает значение своего последнего выражения.

Так что я подозреваю, что более краткая версия будет:

Transformations.map(localLiveData) { it.name = "Hi"; it }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...