我有一个包含键和翻译的消息对象列表。
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内部发生的一切都不存储在任何地方,您只需创建一个实例,而不使用它做任何事情