作者fgh81113 (阿景)
看板java
标题Re: [问题] 多对多关系如何优雅合并?
时间Sun Apr 10 23:42:51 2022
※ 引述《sssyoyo (柚子)》之铭言:
: 各位好,想请教是否有更好的写法,主要针对stream的用法
: 标题可能描述的不太精确,问题简化後模拟是这样:
: 例如有"使用者"与"群组",他们是多对多关系,存在一张DB的中间表
: (一个使用者可以有多个群组身分,一个群组中也能存在多个使用者)
: 今天我查询以"使用者"出发,要列出所属的群组有哪些,返回JSON像这样
: [
: {"userId":1,"groups":[1,2,3]},
: {"userId":2,"groups":[2,3]},
: {"userId":3,"groups":[3]}
: ]
: 我写的方法 https://i.imgur.com/iqnKqPE.png
: ================
: 痛点在於我还需要多定义一个UserVo,感觉应该能直接拼出JSONObject
: 以及我总感觉Stream应该可以更优雅的做到,像是groupingBy、归约之类
: 我这个写的只要key(就是userId)已经存在,就需要clone一份既存的groups资料
: 一直new ArrayList<>好像也挺浪费资源的
: 想询问是否有更好的写法,还请不吝赐教,感谢!
Map<Integer, List<Integer>> userMap =
list.stream().collect(
Collectors.groupingBy(
user -> user.getUserId(),
Collectors.mapping(
user -> user.getGroup(),
Collectors.toList()
)
)
);
List<UserVo> result =
userMap.entrySet().stream()
.map(entry -> {
UserVo vo = new UserVo();
vo.setUserId(entry.getKey());
vo.setGroups(entry.getValue());
return vo;
})
.collect(Collectors.toList());
不想用UserVo那就用Map吧
List<Map<String, Object>> result =
userMap.entrySet().stream()
.map(entry -> {
Map<String, Object> map = new HashMap<>(2);
map.put("userId", entry.getKey());
map.put("groups", entry.getValue());
return map;
})
.collect(Collectors.toList());
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 182.235.90.28 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/java/M.1649605374.A.4F0.html
1F:推 sssyoyo: 谢谢! 学到了 04/16 13:35