是不是我姿势不对,有没有更好的写法?
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)
1
Leviathann OP 发现原来把 MutableList 改成 mutableList 就能直接生成空列表,请大家忽略那行。。
|
2
weimo383 2021-04-18 10:08:56 +08:00 via Android
什么叫 grouping 。。。
|
3
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") } } 你自己选一个 |
4
SoloCompany 2021-04-18 10:25:14 +08:00
不介意一点点性能损失的话, 还可以直接用 List 避免用 MulitableList
.fold(listOf<String>()) { accumulator, it -> println("aggregate") accumulator + (it + "X") } |
5
Leviathann OP @weimo383 就是 java stream 的 Collector.groupingBy + Collector.mapping
@SoloCompany 不可变 list 重载的 + 居然是每次生成新的列表然后把原 list 和被 + 的元素都放进去,这也太暴力了。。 感觉 kotlin 这个地方只提供了比较底层的抽象,没有 java stream api 那种偏向声明式的写法 |
6
SoloCompany 2021-04-18 16:31:54 +08:00
@Leviathann #5 增加了 kotlin.collections.Grouping 这一层接口的中间抽象明显优于 java8 stream 的 Collector 啊
|