V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Leviathann
V2EX  ›  Kotlin

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

  •  
  •   Leviathann · 2021-04-18 03:04:21 +08:00 · 2413 次点击
    这是一个创建于 1076 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    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)
    
    
    
    6 条回复    2021-04-18 16:31:54 +08:00
    Leviathann
        1
    Leviathann  
    OP
       2021-04-18 03:40:15 +08:00 via iPhone
    发现原来把 MutableList 改成 mutableList 就能直接生成空列表,请大家忽略那行。。
    weimo383
        2
    weimo383  
       2021-04-18 10:08:56 +08:00 via Android
    什么叫 grouping 。。。
    SoloCompany
        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") }
    }

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

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

    @SoloCompany 不可变 list 重载的 + 居然是每次生成新的列表然后把原 list 和被 + 的元素都放进去,这也太暴力了。。
    感觉 kotlin 这个地方只提供了比较底层的抽象,没有 java stream api 那种偏向声明式的写法
    SoloCompany
        6
    SoloCompany  
       2021-04-18 16:31:54 +08:00
    @Leviathann #5 增加了 kotlin.collections.Grouping 这一层接口的中间抽象明显优于 java8 stream 的 Collector 啊
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1005 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 19:26 · PVG 03:26 · LAX 12:26 · JFK 15:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.