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

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

  •  1
     
  •   SilenceLL · 2023-04-19 16:16:10 +08:00 · 2993 次点击
    这是一个创建于 620 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    感觉这种问题问问 chatGPT 就行了
    RainCats
        7
    RainCats  
       2023-04-19 16:33:26 +08:00
    A 或者 B 用 stream 转成 map 就好啦,key 是 userId ,这样聚合成 C 的样子时也方便取值
    idealhs
        8
    idealhs  
       2023-04-19 16:35:19 +08:00
    C#用 LinQ 😀
    SilenceLL
        9
    SilenceLL  
    OP
       2023-04-19 16:35:21 +08:00
    @jones2000 @pigeonx @810975 @MonkeyJon @Morii @RainCats
    我们也是这么写的,我一直以为大家手上有黑科技的
    Nexone
        10
    Nexone  
       2023-04-19 16:35:43 +08:00
    c#用 linq 啊 a join b 然后 select
    superedlimited
        11
    superedlimited  
       2023-04-19 16:35:50 +08:00 via iPhone
    rxjava 用 observable.zip
    idealhs
        12
    idealhs  
       2023-04-19 16:37:17 +08:00
    @baobao1270 如果你把 AutoMapper 用作 Entity 与 DTO 转换以外的用途,也许应该思考下是否用错了。
    wfd0807
        13
    wfd0807  
       2023-04-19 16:47:01 +08:00
    @SilenceLL 硬有啥科技的话,数据聚合转换逻辑大部分是有相同模式的,利用范型和函数参数写成工具类即可复用
    xuanbg
        14
    xuanbg  
       2023-04-19 16:55:56 +08:00
    为什么不在数据库里面联表查询,一次拿出来?
    dongya
        15
    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
        16
    RainCats  
       2023-04-19 17:33:00 +08:00
    @SilenceLL 害,哪有那么多黑科技,都是数据加工,就那么些方式,也可能是我层次低
    SilenceLL
        17
    SilenceLL  
    OP
       2023-04-19 17:33:24 +08:00
    @xuanbg 上面只是举例,可能是跨服务,跨库的场景。
    SilenceLL
        18
    SilenceLL  
    OP
       2023-04-19 17:34:01 +08:00
    @wfd0807 好主意
    wliansheng
        19
    wliansheng  
       2023-04-19 17:34:26 +08:00   ❤️ 1
    join ,笛卡尔积 (/doge
    optional
        20
    optional  
       2023-04-19 18:09:05 +08:00
    CQRS , 查询接口直接 queryDSL 或者其他方式 join 查询。
    put/post 按照 entity 更新
    dengji85
        21
    dengji85  
       2023-04-20 08:56:03 +08:00
    我单库也是这样聚合的,很烦去写关联 sql ,所有实体和 dao 都是单表操作
    wowcz
        22
    wowcz  
       2023-05-02 11:26:03 +08:00
    查 3 次表,stream 按 key group ,把两个信息 get set 到 user 里
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2350 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 15:49 · PVG 23:49 · LAX 07:49 · JFK 10:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.