如何分配一个新的列表到一个空字段,如果空或其他只是添加一个元素到现有的列表在Kotlin?

rks48beu  于 2023-04-12  发布在  Kotlin
关注(0)|答案(3)|浏览(155)

我有一个对象media,它包含一个列表descriptions。我希望在Kotlin中看到一些优雅的逻辑,如果字段不为null,则向该descriptions添加一个元素,或者如果字段null,则向该字段添加一个新的列表(带有初始元素)。

伪:

if (media.descriptions == null) { media.descriptions = listOf("myValue")}
else { media.descriptions.add("myValue") }
thigvfpy

thigvfpy1#

您可以将Elvis运算符?:run结合使用:

val e = "myValue"
media.descriptions?.also { it.add(e) } ?: run { media.descriptions = mutableListOf(e) }
  • 如果media.descriptions不为null,安全调用操作符?.使用块it.add(e)调用also,将新元素添加到现有列表中(并返回传递给它的media.descriptions)。
  • 如果media.descriptions为null,则?.不执行also,而是计算为null,Elvis运算符?:返回其右侧,执行初始化字段的run块。

另一种方法是始终赋值(如果字段不为空,则重新赋值),这可能不太直观:

val e = "myValue"
media.descriptions = media.descriptions?.also { it.add(e) } ?: mutableListOf(e)

这类似地工作,但是Elvis操作符?:的两侧都返回要分配给media.descriptions字段的内容,其中左侧具有将元素添加到现有列表的副作用(通过also)。

fnvucqvd

fnvucqvd2#

我可能会用另一种方法来做,除了你需要改变media本身(见下文),即首先创建你的列表,如果media.descriptions不是null,则将所有其他条目添加到该列表中:

val myDescriptions = mutableListOf("myValue") // and maybe others
media.descriptions?.forEach(myDescriptions::add)

如果您需要处理media的描述,那么您无法使其更具可读性...:

if (media.descriptions == null) {
  media.descriptions = mutableListOf("myValue") // just using mutable to make it clear
} else {
  media.descriptions += "myValue"
}

或者:

if (media.descriptions == null) {
  media.descriptions = mutableListOf<String>()
}
media.descriptions?.add("myValue")
avwztpqn

avwztpqn3#

您可以使用elvis ?:运算符来分配列表。
我能想到的最简单的方法就是

media.descriptions = media.descriptions ?: listOf("myValue")
media.descriptions.add("myValue")

相关问题