Kotlin 使用 groupingBy 和聚合求和

Ben*_*n H 7 kotlin

tl/dr:Kotlin 如何使用 groupingBy 和聚合来获得(键,数字)对的序列以求和到计数映射?

我有 30gb 的 csv 文件,可以轻松阅读和解析。

File("data").walk().filter { it.isFile }.flatMap { file ->
    println(file.toString())
    file.inputStream().bufferedReader().lineSequence()
}. // now I have lines
Run Code Online (Sandbox Code Playgroud)

每行都是“key,extraStuff,matchCount”

.map { line ->
    val (key, stuff, matchCount) = line.split(",")
    Triple(key, stuff, matchCount.toInt())
}.
Run Code Online (Sandbox Code Playgroud)

我可以过滤“东西”,这很好,因为很多东西都被丢弃了——是的,懒惰的序列。(省略代码)

但是我需要一种懒惰的方法来获得最终的 Map(key:String to count:Int)。

我应该使用 groupingBy 和聚合,因为eachCount()只会计算行数,而不是总结 matchCount,并且 groupingBy 是懒惰的,而 groupBy 不是,但我们已经达到了我的知识范围。

.groupingBy { (key, _, _) ->
    key
}.aggregate { (key, _, matchCount) ->
    ??? something with matchCount ???
}
Run Code Online (Sandbox Code Playgroud)

Ily*_*lya 5

您可以使用Grouping.fold扩展名而不是Grouping.aggregate. 它更适合按特定属性汇总分组条目:

triples
    .groupingBy { (key, _, _) -> key }
    .fold(0) { acc, (_, _, matchCount) -> acc + matchCount }
Run Code Online (Sandbox Code Playgroud)