如何在 Java 8 中使用特定标准对列表进行分组

我有一个如下所示的数据结构。我正在尝试以这样的方式对对象进行分组,例如Map<String, List<String>>key 是 entryId 而 value 是它所属的组列表。entryId 在组内始终是唯一的。


示例:entryId "1111" 属于 group1,group2,group3。我正在使用旧的 java 7 方式来遍历列表并进行检查。有没有最好的方法使用 Java8 收集器/分组来实现这一点。


List<Group> 其中每个 Group 对象将有一个 Entry 对象列表。


    [  

   {  

      "id":"group1",

      "entries":[  

         {  

            "entryId":"1111",

            "name":"test1"

         },

         {  

            "entryId":"2222",

            "name":"test2"

         },

         {  

            "entryId":"3333",

            "name":"test3"

         }

      ]

   },

   {  

      "id":"group2",

      "entries":[  

         {  

            "entryId":"4444",

            "name":"test1"

         },

         {  

            "entryId":"1111",

            "name":"test2"

         },

         {  

            "entryId":"2222",

            "name":"test3"

         }

      ]

   },

   {  

      "id":"group3",

      "entries":[  

         {  

            "entryId":"1111",

            "name":"test1"

         },

         {  

            "entryId":"5555",

            "name":"test2"

         },

         {  

            "entryId":"3333",

            "name":"test3"

         }

      ]

   }

]

所以预期的输出是这样的:


    [  

   {  

      "1111":[  

         "group1",

         "group2",

         "group3"

      ]

   },

   {  

      "2222":[  

         "group1",

         "group2"

      ]

   },

   {  

      "3333":[  

         "group1",

         "group3"

      ]

   },

   {  

      "4444":[  

         "group2"

      ]

   },

   {  

      "5555":[  

         "group3"

      ]

   }

]


拉风的咖菲猫
浏览 153回答 2
2回答

慕侠2389804

你可以这样做:Map<String, Set<String>> entryMaps = new LinkedHashMap<>();groups.forEach(group ->&nbsp;&nbsp; &nbsp; group.getEntries().forEach(entry ->&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; entryMaps.computeIfAbsent(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; entry.getEntryId().toLowerCase(),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; k -> new LinkedHashSet<>())&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .add(group.getId())));这会迭代组,然后是每个组的条目Map.computeIfAbsent,LinkedHashSet如果键不存在,则使用新的空条目放置条目,返回此空集或匹配该键的集。然后,组 id 被添加到这个返回的集合中。注意:我使用 aSet而不是Listfor 值,以避免可能的重复。而LinkedHashMap和LinkedhashSet保证插入顺序。

胡子哥哥

像这样的东西应该可以工作,它需要制作某种中间元组对象:list.stream().flatMap(group ->&nbsp; &nbsp;group.getEntries.stream()&nbsp; &nbsp; &nbsp; &nbsp; .map(entry -> new GroupEntry(group.getId(), entry.getEntryId()))).collect(&nbsp; &nbsp;Collectors.groupingBy(GroupEntry::getEntryId, Collectors.mapping(GroupEntry::getGroupId, Collectors.toList())));
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java