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

如果我想将我的Kotlin集合收集到stdlib中没有构建的东西中,我该怎么做?

对于内置操作toList()等没有涉及的场景,您可以使用这个事实,收集只是一个折叠。 如此给予

 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等价物”的标题?

在stdlib中有函数用于平均,计数,清除,过滤,查找,分组,加入,映射,最小值,最大值,分割,切片,排序,求和,从数组到/从列表,到/从地图,联合,共同迭代,所有功能范例等等。 小的1行,不需要使用更复杂的Java 8语法。 我认为内置的Java 8 Collectors类中唯一缺少的就是汇总

另一个SO Post详细介绍了这些等价物: 标准Kotlin库中有哪些Java 8 Stream.collect等价物可用?