如果我想将我的Kotlin系列收集到stdlib中没有的内容中,我该怎么做?
答案 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?