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

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

  •  
  •   unregister · 2022-08-14 11:36:24 +08:00 · 1592 次点击
    这是一个创建于 593 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如 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  
       2022-08-14 12:12:45 +08:00 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
       2022-08-14 12:42:31 +08:00
    @ghouleztt 谢谢,这个方法可以。
    aguesuka
        3
    aguesuka  
       2022-08-15 01:45:00 +08:00   ❤️ 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  
       2022-08-15 09:53:22 +08:00   ❤️ 1
    如果你后面不需要使用组合 key 的各项, 可以按 1 楼的 string 方式
    如果你需要使用, map 的 key 可以是自己定义的类, 处理 tostring 和 hashcode 就行,
    qinxi
        5
    qinxi  
       2022-08-15 09:54:18 +08:00
    @qinxi #4 更正 是 eq 和 hashcode
    unregister
        6
    unregister  
    OP
       2022-08-15 12:34:06 +08:00
    @aguesuka 谢谢大佬。
    @qinxi 好的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3038 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 11:02 · PVG 19:02 · LAX 04:02 · JFK 07:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.