使用复数累加器折叠/减少

索玛亚·库布拉

我有一个看起来像这样的列表:

val myList = listOf(
    Message(
      id= 1,
      info = listOf(1, 2)
    ),
    Message(
      id= 1,
      info = listOf(3, 4)
    ),
    Message(
      id= 2,
      info = listOf(5, 6)
    ) 
)

如何转换它以便组合具有相同 id 的元素?

listOf(
    Message
      id= 1
      info = listOf(1, 2, 3, 4)
    ),
    Message
      id= 2
      info = listOf(5, 6)
    ) 
)

我已经尝试了以下,它的工作原理


myList
    .groupBy { it.id }   
    .map { entry ->
        val infos = entry.value.fold(listOf<Int>()) { acc, e -> acc + e.info }

        Message(
            id = entry.key,
            info = infos
        )
    }

但我想知道是否有更简单/更干净/更惯用的方式来合并这些对象。似乎我可以用一个折叠来做到这一点,但我无法将我的大脑包裹在它周围。

谢谢

罗兰

也可以通过(比较)groupingBy做一些不同的事情foldGrouping

myList.groupingBy { it.id }
      .fold({ _, _ -> mutableListOf<Int>() }) { _, acc, el ->
        acc.also { it += el.info }
      }
      .map { (id, infos) -> Message(id, infos) }

这样,您只有 1 个中间映射,每个键只有 1 个中间列表,这会累积您的值。最后,您将其转换为您需要的形式(例如转换为 a Message)。也许你甚至不需要那个?也许地图已经是你所追求的?

在这种情况下,您可能希望使用以下内容(即缩小值的可变列表类型):

val groupedMessages : Map<Int, List<Int>> = myList.groupingBy { it.id }
    .fold({ _, _ -> mutableListOf() }) { _, acc, el ->
      acc.also { it += el.info }
    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章