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

时间:2016-01-06 17:35:11

标签: collections kotlin

如果我想将我的Kotlin系列收集到stdlib中没有的内容中,我该怎么做?

2 个答案:

答案 0 :(得分:17)

对于内置操作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扩展功能。

答案 1 :(得分:6)

注意: 对于在Java 8中使用Stream.collect的一些常见情况,您可以在Kotlin中使用已有的stdlib函数。对于那些你在Kotlin找不到的人,你可以探索创建自定义流程,如@duncan的答案所述。添加此答案是为了帮助了解stdlib中的功能,以便您可以决定何时编写自定义内容。它回答了问题的标题&#34;什么是Java Stream.collect的Kotlin等价物?&#34;

stdlib中有一些函数用于平均,计数,分离,过滤,查找,分组,连接,映射,最小化,最大化,分区,切片,排序,求和,到/从数组到/从列表到/来自地图,联合,共同迭代,所有功能范例等等。很少1行,不需要使用更复杂的Java 8语法。我认为内置的Java 8 Collectors类中唯一缺少的是摘要

另一篇SO帖子详细介绍了这些等效内容:What Java 8 Stream.collect equivalents are available in the standard Kotlin library?

相关问题