LiveData转换中的Transformations.map带有两个参数:
我试图使函数像这样:
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的菜鸟)
答案 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 }