Kotlin中的LiveData地图转换

时间:2019-05-03 09:27:36

标签: kotlin lambda

LiveData转换中的Transformations.map带有两个参数:

  1. @NonNull LiveData源
  2. @NonNull最终函数函子

我试图使函数像这样:

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
            }

这是怎么回事,工作图只有一个论点? (kotlin的菜鸟)

1 个答案:

答案 0 :(得分:0)

这里的大多数问题与Kotlin的lambda语法有关,这与某些其他语言的语法稍有不同。

在Kotlin中,lambda必须带有花括号。但是->在某些情况下是可选的(如果lambda不带参数;或者如果lambda带有参数,而您使用的是虚拟名称it则引用它)。

这是您的第一个版本失败的原因之一;则需要将s ->移动到括号内。 (另一个是在Kotlin中,赋值不是表达式,也不返回值,因此您不能在return中使用它。)

您的第二个作品是有效的,因为在Kotlin中,如果最后一个参数是lambda,则可以将其移到括号之外。 (这允许使用看起来像语言语法的高阶函数。实际上,如果lambda是 only 参数,则可以完全省略括号!)

我不了解LiveData,但我想知道return@map是否做正确的事:它不仅会从lambda返回,而且会从map()方法本身返回。 (这种非本地回报不是经常需要的,并且可能会造成混淆。)

此外,lambda不需要显式的return;它返回其最后一个表达式的值。

所以我怀疑会是一个更简洁的版本:

Transformations.map(localLiveData) { it.name = "Hi"; it }