首页 > 解决方案 > 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 流函数进行分组?

标签: javalistjava-8grouping

解决方案


我宁愿这样做,

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作为键,并将实例的属性作为值ListFavorite然后对于地图中的每个条目,我将FavoriteGroup通过解码键并按原样传递值来创建一个新条目。作为最后一步collect,将生成的对象放入容器中。


推荐阅读