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

数据库集合返回一个 DTO 的集合。使用 Stream Group by 多个字段拼接进行分组,其中有需要根据 6 个字段进行分组的,有需要根据 4 个字段进行分组的,怎么比较‘优雅’的实现。不采用 SQL 里面分组是业务需要。

  •  
  •   unregister · 109 天前 · 1123 次点击
    这是一个创建于 109 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如 users.stream().collect(Collectors.groupingBy(u->u.getEdu + "" + u->u.getCity + "" + u->u.getCountry)); users.stream().collect(Collectors.groupingBy(u->u.getEdu + "" + u->u.getCity + "" + u->u.getCountry +u->.getGender)); 怎么使用函数封装 groupingBy 里面的条件比较好,因为除了里面拼接条件有不一样,其他都一样,(只是单纯讨论,看看除了用两个 Stream 写之外有没有别的方式,用一个 Stream 然后 groupBy 一个 Function )

    6 条回复    2022-08-15 12:34:06 +08:00
    ghouleztt
        1
    ghouleztt  
       109 天前 via iPhone   ❤️ 3
    本类添加一个方法,private static String genGroupKey(User user, int type){},此方法根据 type 的不同返回不同的组合 key 。使用的时候 users.stream().collect(Collectors.groupingBy(s->genGroupKey(s,1))。手机打字将就看吧
    unregister
        2
    unregister  
    OP
       109 天前
    @ghouleztt 谢谢,这个方法可以。
    aguesuka
        3
    aguesuka  
       109 天前   ❤️ 1
    @SafeVarargs
    public static <T> Collector<T, ?, Map<String, List<T>>> groupByProperties(Function<? super T, String>... properties) {
    return Collectors.groupingBy(t -> Arrays.stream(properties)
    .map(getter -> getter.apply(t))
    .collect(Collectors.joining(/*FIXME*/)));
    }

    users.stream().collect(groupByProperties(User::getEdu, User::getCity, User::getCountry))
    qinxi
        4
    qinxi  
       108 天前   ❤️ 1
    如果你后面不需要使用组合 key 的各项, 可以按 1 楼的 string 方式
    如果你需要使用, map 的 key 可以是自己定义的类, 处理 tostring 和 hashcode 就行,
    qinxi
        5
    qinxi  
       108 天前
    @qinxi #4 更正 是 eq 和 hashcode
    unregister
        6
    unregister  
    OP
       108 天前
    @aguesuka 谢谢大佬。
    @qinxi 好的。
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1204 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 20:27 · PVG 04:27 · LAX 12:27 · JFK 15:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.