Kotlin - 从映射在列表中追加元素 - 预期列表<Object>,找到列表<Kotlin.Unit>



我有一个包含键和翻译的消息对象列表。

val messages = mutableListOf<Message>()

从这个消息列表中,我想得到它的翻译。

在简单地映射到Translation对象之前,我检查Message对象的特定属性,并循环遍历一个额外的列表以将新的翻译添加到我的列表中。

消息由4个元素组成,我期望,当迭代messages.list时,总共有6个元素

有:

  • Element[0] (unlock=false): Translation(message.key)
  • 元素[1](解锁=true): kotlin。单位
  • 元素[2](解锁=true): kotlin。单位
  • Element[3] (unlock=false): Translation(message.key)

:

  • Element[0] (unlock=false): Translation(message.key)
  • Element[1] (unlock=true): Translation("unlock")
  • Element[2] (unlock=true): Translation("unlock")
  • Element[3] (unlock=true): Translation("unlock">
  • Element[4] (unlock=true): Translation("unlock")
  • Element[5] (unlock=false): Translation(message.key)

代码:

val translationList = messages.map { message ->
if (message.unlock == "true") {
message.list.forEachIndexed { index, item ->
Translation("unlock")
}
}
else {
Translation(message.key)
}

我可以清楚地看到迭代是正确完成的,但是追加失败了。

如何遍历映射中的列表,将Translation对象附加到同一列表并避免Kotlin。单元类型?

Edit1:添加Message和Translation类

data class Message(@JacksonXmlProperty(localName = "unlock", isAttribute = true)
val unlock: String? = null,
@JacksonXmlProperty(localName = "key")
val key: String? = null,
@JacksonXmlProperty(localName = "list")
val list: MutableList<String>? = null,
@JacksonXmlElementWrapper(useWrapping = true)
@JacksonXmlProperty(localName = "translation")
val translation: Translation? = null)
data class Translation(@JacksonXmlProperty(localName = "type", isAttribute = true)
val type: String? = null,
@JacksonXmlProperty(localName = "innerText")
@JacksonXmlText
val text: String? = null)

既然您想要将一个事物映射到多个事物,那么您应该使用flatMap。在flatMap的lambda中,您可以返回一个Iterable,其中包含您希望将每个元素映射到的对象。

val translationList = messages.flatMap { message ->
// you might want to use a Bool for message.unlock instead :)
if (message.unlock == "true") {
// we transform each element of message.list into a translation
// forEach gives you Unit, map gives you the transformed list
message.list.map { Translation("unlock") }
}
else {
listOf(Translation(message.key))
}
}

您的messages.map调用将每个消息映射到内部lambda调用的结果:

message ->
if (message.unlock == "true") {
message.list.forEachIndexed { index, item ->
Translation("unlock")
}
}
else {
Translation(message.key)
}

else部分很简单——简单地将它映射到新的Translation对象。但是在if部分,它很棘手—lambda的返回值是最后一行,即message.list.forEachIndexed,它返回Unit—forEachIndexed内部发生的一切都不存储在任何地方,您只需创建一个实例,而不使用它做任何事情

相关内容

  • 没有找到相关文章

最新更新