java - Java 8组对象列表,里面有列表
问题描述
我的 java 项目中有两个对象,如下所示:
FavoriteGroup
- int id
- string userId
- string name
- List<Favorite> favorites
和
Favorite
- int id
- int groupId
- string title
- string path
现在,我有一个可能重复组的项目列表。我是否有办法对列表进行分组,以使我所有的收藏列表都加入了每个收藏组?
更多图形解释:我有:
[{
id: 1,
userId: 1,
name: "Group one",
favorites: [{
id: 100,
groupId: 1,
title: "Favorite 1",
path: "path 1"
}]
},
{
id: 1,
userId: 1,
name: "Group one",
favorites: [{
id: 200,
groupId: 1,
title: "Favorite 2",
path: "path 2"
}]
},
{
id: 2,
userId: 1,
name: "Group two",
favorites: [{
id: 300,
groupId: 2,
title: "Favorite 3",
path: "path 3"
}]
}]
我需要:
[{
id: 1,
userId: 1,
name: "Group one",
favorites: [{
id: 100,
groupId: 1,
title: "Favorite 1",
path: "path 1"
},
{
id: 200,
groupId: 1,
title: "Favorite 2",
path: "path 2"
}]
},
{
id: 2,
userId: 1,
name: "Group two",
favorites: [{
id: 300,
groupId: 2,
title: "Favorite 3",
path: "path 3"
}]
}]
最好的方法是什么?使用 for 循环迭代或可能对 java 8 流函数进行分组?
解决方案
我宁愿这样做,
private static final String DELIMITER = "-";
Map<String, List<Favorite>> favsByGroup = favGroups.stream()
.collect(Collectors.groupingBy(g -> g.getId() + DELIMITER + g.getUserId() + DELIMITER + g.getName(),
Collectors.flatMapping(fg -> fg.getFavorites().stream(), Collectors.toList())));
List<FavoriteGroup> mergedFavoriteGroups = favsByGroup.entrySet().stream()
.map(e -> new FavoriteGroup(Integer.parseInt(e.getKey().split(DELIMITER)[0]),
e.getKey().split(DELIMITER)[1], e.getKey().split(DELIMITER)[2], e.getValue()))
.collect(Collectors.toList());
首先创建一个映射,将连接的 Id、userId 和 name 属性FavoriteGroup
作为键,并将实例的属性作为值List
。Favorite
然后对于地图中的每个条目,我将FavoriteGroup
通过解码键并按原样传递值来创建一个新条目。作为最后一步collect
,将生成的对象放入容器中。
推荐阅读
- css - SVG无限动画无法正常工作
- java - 有人可以解释一下这个代码片段吗?
- node.js - 如何正确格式化此 EJS 三元条件?
- python - Python,散景日期时间图表 - 空白输出
- angular - 如何从 JSON 文件中获取数据并显示在网页上
- c# - 除非更改文件扩展名,否则 File.Delete 上的 UnauthorizedAccessException
- python - ValueError:无法为具有形状“(?,2)”的张量“Placeholder:0”提供形状(2、1000、1)的值
- functional-programming - KDB+ 应用条件然后更新表中的多个列
- laravel - VueJS - 方法内的动态函数名称
- shell - 如何找到 IMAP 服务器上的每个非空垃圾文件夹?