大家一般如何聚合多个 list 的数据

2023-04-19 16:16:10 +08:00
 SilenceLL

比如: A 方法查询 List<User> B 方法查询 List<UserAddress> C 方法聚合返回 List<UserInfo> 两者之间通过 user_id 关联,一般大家都是怎么去做聚合。 有没有相对大型且规范的业务项目可以学习一下

2694 次点击
所在节点    Java
22 条回复
jones2000
2023-04-19 16:19:16 +08:00
存库, 做一个视图就完事了。
pigeonx
2023-04-19 16:19:42 +08:00
写到数据库->聚合->拿出来 /doge
810975
2023-04-19 16:20:20 +08:00
直接都转换成 Map userId 做 key 。。然后遍历请求的 list 做数据整合 。。很原始 但是挺好用啊
MonkeyJon
2023-04-19 16:21:14 +08:00
其他俩转 map,userId 为 key
baobao1270
2023-04-19 16:21:27 +08:00
C# 有 AutoMapper ,不知道 Java 有没有类似的东西
Morii
2023-04-19 16:30:10 +08:00
Stream + Collectors.groupingBy

感觉这种问题问问 chatGPT 就行了
RainCats
2023-04-19 16:33:26 +08:00
A 或者 B 用 stream 转成 map 就好啦,key 是 userId ,这样聚合成 C 的样子时也方便取值
idealhs
2023-04-19 16:35:19 +08:00
C#用 LinQ 😀
SilenceLL
2023-04-19 16:35:21 +08:00
@jones2000 @pigeonx @810975 @MonkeyJon @Morii @RainCats
我们也是这么写的,我一直以为大家手上有黑科技的
Nexone
2023-04-19 16:35:43 +08:00
c#用 linq 啊 a join b 然后 select
superedlimited
2023-04-19 16:35:50 +08:00
rxjava 用 observable.zip
idealhs
2023-04-19 16:37:17 +08:00
@baobao1270 如果你把 AutoMapper 用作 Entity 与 DTO 转换以外的用途,也许应该思考下是否用错了。
wfd0807
2023-04-19 16:47:01 +08:00
@SilenceLL 硬有啥科技的话,数据聚合转换逻辑大部分是有相同模式的,利用范型和函数参数写成工具类即可复用
xuanbg
2023-04-19 16:55:56 +08:00
为什么不在数据库里面联表查询,一次拿出来?
dongya
2023-04-19 16:57:48 +08:00
chatgpt 回答

针对这个问题,通常有以下几种解决方案:

在 C 方法中嵌套调用 A 、B 方法,通过 user_id 进行聚合返回 List<UserInfo>。但这种方法存在一个问题,如果数据量较大,调用多次 A 、B 方法,会造成性能问题。

在程序启动时,将 A 方法和 B 方法查询的数据缓存到本地内存或者 Redis 等缓存中,C 方法中直接从缓存中获取并进行聚合返回 List<UserInfo>。这种方法可以提高查询性能,但存在缓存一致性的问题,需要考虑缓存失效策略。

通过 SQL 语句进行关联查询,一次性返回 List<UserInfo>。这种方法可以减少程序调用次数,提高查询性能。但是需要注意的是,对于大数据量的情况,这种方式也可能会导致性能问题,需要根据具体情况进行调优。

针对相对大型且规范的业务项目,可以参考一些开源项目,如:

Apache Shiro:安全框架,提供了完善的身份认证、授权、加密等功能。
Spring Framework:应用程序开发框架,提供了 IOC 、AOP 、事务管理等功能。
MyBatis:持久层框架,提供了 ORM 映射、SQL 生成等功能。
以上开源项目中,都涉及到多个业务模块之间的数据关联和聚合查询。可以根据自己的需求选择适合自己的开源项目进行学习。
RainCats
2023-04-19 17:33:00 +08:00
@SilenceLL 害,哪有那么多黑科技,都是数据加工,就那么些方式,也可能是我层次低
SilenceLL
2023-04-19 17:33:24 +08:00
@xuanbg 上面只是举例,可能是跨服务,跨库的场景。
SilenceLL
2023-04-19 17:34:01 +08:00
@wfd0807 好主意
wliansheng
2023-04-19 17:34:26 +08:00
join ,笛卡尔积 (/doge
optional
2023-04-19 18:09:05 +08:00
CQRS , 查询接口直接 queryDSL 或者其他方式 join 查询。
put/post 按照 entity 更新

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

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

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

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

© 2021 V2EX