【问题标题】:Transform collection of items with another collection inside in kotlin在 kotlin 中使用另一个集合转换项目集合
【发布时间】:2020-10-28 11:04:07
【问题描述】:

我有一些物品。每个项目里面都有另一个集合。

为了转换第一个集合,我使用了 mapNotNull。 我正在尝试实现这样的目标:

data class QuestionData(        
        val items: List<Question>
)

val questions = listOf(
        QuestionData(0, emptyList()),
        QuestionData(1, listOf(Question(2, emptyList()))),
)

fun convertItem(item: QuestionData): QuestionEntity {
    return QuestionEntity(item)
}


val result: List<QuestionEntity> = questions.mapNotNull {
    convertItem(it)
    it.items.forEach {it2-> convertItem(it2) }
}

但这不起作用。

【问题讨论】:

  • 你试过 flatMap 吗?
  • 如果 OP 的目标不是扁平化初始集合,我认为 flatMap 不会有用
  • 第一个皈依者在做什么?

标签: android kotlin inline-functions


【解决方案1】:

传递给 mapNotNull 函数的 lambda 主体不会返回初始项,因为 forEach 返回 Unit 作为 lambda 主体中的最后一条语句,因此最终结果是 List

您应该从 mapNotNull 返回 it 以使其正常工作

例如:

data class Question(
        var someCounter: Int,
        val items: List<Question>
)

val questions = listOf(
        Question(0, emptyList()),
        Question(1, listOf(Question(2, emptyList()))),
)

fun convertItem(item: Question) {
    item.someCounter++
}

val result = questions.mapNotNull {
    convertItem(it)
    it.items.forEach { it2 -> convertItem(it2) }
    it
}

尽管它不是非常惯用的代码,但可以从一些东西开始

【讨论】:

  • 为什么不questions.filterNotNull().map { convertItem(it).copy(items = it.items.map {item -&gt; convertItem(item)}) }
  • 是的,这绝对是一个选择。如果您确定要复制整个对象以改变一个属性,或者嵌套对象本质上是不可变的
  • 那行不通。最后一个“it”与转换函数的返回类型不同。
猜你喜欢
  • 2013-12-21
  • 1970-01-01
  • 1970-01-01
  • 2010-10-17
  • 2016-02-28
  • 2012-11-20
  • 1970-01-01
  • 2016-05-16
  • 1970-01-01
相关资源
最近更新 更多