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

Dun*_*gor 15 collections kotlin

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

Dun*_*gor 20

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

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

您可以通过折叠收集您选择的集合

val map: Map<String, Int> = list.fold(HashMap(), { accumulator, item ->
    accumulator.put(item.first, item.second); accumulator})
Run Code Online (Sandbox Code Playgroud)

如果您然后定义扩展功能

fun <T, R> Iterable<T>.collectTo(accumulator: R, accumulation: (R, T) -> Unit) = 
    this.fold(accumulator, { accumulator, item -> accumulation(accumulator, item); accumulator } )
Run Code Online (Sandbox Code Playgroud)

你可以进一步简化

val map2: Map<String, Int> = list.collectTo(HashMap(), { accumulator, item -> 
    accumulator.put(item.first, item.second) })
Run Code Online (Sandbox Code Playgroud)

虽然在这种情况下你当然可以使用.toMap扩展功能.


Jay*_*ard 7

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

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

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