【问题标题】:What is the Kotlin equivalent of Java Stream.collect?Java Stream.collect 的 Kotlin 等价物是什么?
【发布时间】:2016-04-10 21:39:29
【问题描述】:

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

【问题讨论】:

标签: collections kotlin


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    标准库中有用于平均、计数、不同、过滤、查找、分组、连接、映射、最小值、最大值、分区、切片、排序、求和、到/从数组、到/从列表、到/的函数从映射、联合、协同迭代、所有功能范式等等。小的 1-liners,不需要使用更复杂的 Java 8 语法。我认为内置 Java 8 Collectors 类中唯一缺少的就是摘要

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

    【讨论】:

      猜你喜欢
      • 2017-10-29
      • 1970-01-01
      • 2022-11-15
      • 1970-01-01
      • 1970-01-01
      • 2017-03-14
      • 2019-12-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多