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

2022-08-14 11:36:24 +08:00
 unregister

比如 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 )

1617 次点击
所在节点    Java
6 条回复
ghouleztt
2022-08-14 12:12:45 +08:00
本类添加一个方法,private static String genGroupKey(User user, int type){},此方法根据 type 的不同返回不同的组合 key 。使用的时候 users.stream().collect(Collectors.groupingBy(s->genGroupKey(s,1))。手机打字将就看吧
unregister
2022-08-14 12:42:31 +08:00
@ghouleztt 谢谢,这个方法可以。
aguesuka
2022-08-15 01:45:00 +08:00
@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
2022-08-15 09:53:22 +08:00
如果你后面不需要使用组合 key 的各项, 可以按 1 楼的 string 方式
如果你需要使用, map 的 key 可以是自己定义的类, 处理 tostring 和 hashcode 就行,
qinxi
2022-08-15 09:54:18 +08:00
@qinxi #4 更正 是 eq 和 hashcode
unregister
2022-08-15 12:34:06 +08:00
@aguesuka 谢谢大佬。
@qinxi 好的。

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

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

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

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

© 2021 V2EX