Java Stream.collect 的 Kotlin 等价物是什么?

What is the Kotlin equivalent of Java Stream.collect?

如果我想将我的 Kotlin 集合收集到标准库中未内置的东西中,我该怎么做?

对于内置操作 toList() 等未涵盖的场景,您可以使用 collect 只是一个折叠的事实。所以给出

val list: List<Pair<String, Int>> = listOf("Ann" to 19, "John" to  23)

您可以通过折叠

收集到您选择的 collection
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 扩展功能。

注意: 对于一些常见的情况,您可以使用 [=35= 中的 Stream.collect ] 8、可以在Kotlin中使用已经存在的stdlib函数。对于那些在 Kotlin 中找不到的内容,您可以探索创建自定义流程,如@duncan 的回答中所述。添加此答案是为了帮助了解 stdlib 中的功能,因此您可以决定何时编写自定义内容。它回答了问题的标题 "What is the Kotlin equivalent of Java Stream.collect?"

stdlib 中有用于平均、计数、不同、过滤、查找、分组、连接、映射、最小值、最大值、分区、切片、排序、求和、to/from 数组的函数,to/from 列表、to/from 映射、联合、co-iteration、所有函数范式等等。很少的 1 行,不需要使用 Java 8 的更复杂的语法。 我认为 built-in Java 8 Collectors 中唯一缺少的东西class是总结

另一个 SO Post 详细介绍了这些等效项是:What Java 8 Stream.collect equivalents are available in the standard Kotlin library?