【发布时间】:2016-04-10 21:39:29
【问题描述】:
如果我想将我的 Kotlin 集合收集到 stdlib 中未内置的东西中,我该怎么做?
【问题讨论】:
标签: collections kotlin
如果我想将我的 Kotlin 集合收集到 stdlib 中未内置的东西中,我该怎么做?
【问题讨论】:
标签: collections kotlin
对于内置操作toList() 等未涵盖的场景,您可以使用 collect 只是折叠的事实。所以给定
val list: List<Pair<String, Int>> = listOf("Ann" to 19, "John" to 23)
您可以通过折叠收集到您选择的集合
val map: Map<String, Int> = list.fold(HashMap(), { accumulator, item ->
accumulator.put(item.first, item.second); accumulator})
如果你再定义一个扩展函数
fun <T, R> Iterable<T>.collectTo(accumulator: R, accumulation: (R, T) -> Unit) =
this.fold(accumulator, { accumulator, item -> accumulation(accumulator, item); accumulator } )
你可以进一步简化
val map2: Map<String, Int> = list.collectTo(HashMap(), { accumulator, item ->
accumulator.put(item.first, item.second) })
虽然在这种情况下你当然可以只使用.toMap 扩展函数。
【讨论】:
注意: 对于一些使用 Java 8 中的 Stream.collect 的常见情况,您可以使用 Kotlin 中现有的 stdlib 函数。对于那些在 Kotlin 中找不到的人,您可以探索创建自定义流程,如 @duncan 的回答中所述。添加此答案以帮助了解 stdlib 中的功能,因此您可以决定何时编写自定义内容。它回答了问题的标题“Java Stream.collect 的 Kotlin 等价物是什么?”
标准库中有用于平均、计数、不同、过滤、查找、分组、连接、映射、最小值、最大值、分区、切片、排序、求和、到/从数组、到/从列表、到/的函数从映射、联合、协同迭代、所有功能范式等等。小的 1-liners,不需要使用更复杂的 Java 8 语法。我认为内置 Java 8 Collectors 类中唯一缺少的就是摘要。
另一篇 SO 帖子详细介绍了这些等效项:What Java 8 Stream.collect equivalents are available in the standard Kotlin library?
【讨论】: