代码之家  ›  专栏  ›  技术社区  ›  Phoenix_uy

Java8组对象列表,其中包含列表

  •  2
  • Phoenix_uy  · 技术社区  · 8 年前

    FavoriteGroup
    - int id
    - string userId
    - string name
    - List<Favorite> favorites
    

    和

    Favorite
    - int id
    - int groupId
    - string title
    - string path
    

    我是否有一种方法来对列表进行分组,使我的所有最喜爱列表都加入了每个FavoriteGroup?

    更多图解说明:

    [{ 
        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" 
            }]
    
         }]
    

    最好的办法是什么?使用循环迭代或者分组Java8流函数?

    2 回复  |  直到 8 年前
        1
  •  2
  •   Ravindra Ranwala    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());
    

    首先创建一个映射,其中包含 FavoriteGroup 作为关键和关键 List Favorite 实例作为值。然后,对于地图中的每个条目,我将创建一个新的 通过解码键并按原样传递值。作为最后一步 collect

        2
  •  0
  •   Kartik    8 年前

    试试这个:-

    favoriteGroups.stream()
            .collect(Collectors.toMap(FavoriteGroup::getId, Function.identity(), (fg1, fg2) -> {
                //This will modify the original object(s). If you don't want that, then you'll have to clone the object and set favorites.
                fg1.setFavorites(Stream.concat(fg1.getFavorites().stream(), fg2.getFavorites().stream())
                        .collect(Collectors.toList()));
                return fg1;
            }))
            .values();
    

    这将返回类型为的对象 Collection<FavoriteGroup> ,您可以对其进行迭代。如果你想把它转换回 List List<FavoriteGroup> list = new ArrayList<>(favoriteGroupsCollection); .