kotlin lazy 形式的 grouping and mapping 应该怎么写, sequence 里 grouping + aggregate 怎么比 Java stream 还复杂得多

2021-04-18 03:04:21 +08:00
 Leviathann

是不是我姿势不对,有没有更好的写法?

val kotlin = "ABCDEF".asSequence()
    .groupingBy {
        println("grouping")
        it.toInt() / 10
    }
    .aggregate { _, accumulator: MutableList<String>?, element, first ->
        println("aggregate")
        if (first) {
            val tmp = MutableList(0) { "" }
            tmp.add(element.toString() + "X")
            tmp
        } else {
            accumulator!!.add(element.toString() + "X")
            accumulator
        }
    }
println(kotlin)


val java = "ABCDEF".toList().stream()
    .collect(
        Collectors.groupingBy(
            { println("java grouping"); it.toInt() / 10 },
            Collectors.mapping({ println("java mapping"); it.toString() + "X" }, Collectors.toList())
        )
    )
println(java)


2452 次点击
所在节点    Kotlin
6 条回复
Leviathann
2021-04-18 03:40:15 +08:00
发现原来把 MutableList 改成 mutableList 就能直接生成空列表,请大家忽略那行。。
weimo383
2021-04-18 10:08:56 +08:00
什么叫 grouping 。。。
SoloCompany
2021-04-18 10:20:52 +08:00
.fold({ _, _ -> mutableListOf<String>() }) { _, accumulator, it ->
println("aggregate")
accumulator.apply { add(it + "X") }
}

或者

.aggregate { _, accumulator: MutableList<String>?, it, _ ->
println("aggregate")
(accumulator ?: mutableListOf()).apply { add(it + "X") }
}

你自己选一个
SoloCompany
2021-04-18 10:25:14 +08:00
不介意一点点性能损失的话, 还可以直接用 List 避免用 MulitableList

.fold(listOf<String>()) { accumulator, it ->
println("aggregate")
accumulator + (it + "X")
}
Leviathann
2021-04-18 14:37:19 +08:00
@weimo383 就是 java stream 的 Collector.groupingBy + Collector.mapping

@SoloCompany 不可变 list 重载的 + 居然是每次生成新的列表然后把原 list 和被 + 的元素都放进去,这也太暴力了。。
感觉 kotlin 这个地方只提供了比较底层的抽象,没有 java stream api 那种偏向声明式的写法
SoloCompany
2021-04-18 16:31:54 +08:00
@Leviathann #5 增加了 kotlin.collections.Grouping 这一层接口的中间抽象明显优于 java8 stream 的 Collector 啊

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/771382

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX