【问题标题】:Java Group objects by values in object's list [duplicate]Java按对象列表中的值对对象进行分组[重复]
【发布时间】:2020-06-25 11:44:41
【问题描述】:

问题

我有一个对象列表,例如:

Class MyObj {
  private List<Integer> categories;
  private String name;
}

我想使用单个流链将对象列表映射到 Map&lt;Integer, List&lt;MyObj&gt;&gt;

示例

MyObj obj1 = new MyObj("name1", Arrays.asList(1, 2, 3));

MyObj obj2 = new MyObj("name2", Arrays.asList(1, 4, 3));

MyObj obj3 = new MyObj("name3", Arrays.asList(4));

List<MyObj> objsList = Arrays.asList(obj1, obj2, obj3);

// Here is what Im trying to accomplish:
// a map like -> **{1: [obj1, obj2], 2: [obj1], 3: [obj1, obj2], 4: [obj2, obj3]}**

Map<Integer, List<MyObj>> = objsList.stream
...help

寻找地图 -> {1: [obj1, obj2], 2: [obj1], 3: [obj1, obj2], 4: [obj2, obj3]}

我认为答案很明显,但我似乎无法让它工作并且很难搜索。提前谢谢你

【问题讨论】:

    标签: java java-stream


    【解决方案1】:

    您可以从每个MyObj 流式传输List 并将IntegerMyObj 成对收集,然后使用Collectors.groupingBy

     Map<Integer,List<MyObj>> result = objsList.stream()
                .flatMap(obj->obj.getCategories().stream().map(i-> Map.entry(i,obj)))
                .collect(Collectors.groupingBy(Map.Entry::getKey,Collectors.mapping(Map.Entry::getValue,Collectors.toList())));
    

    注意:Map.entry来自java 9,你可以使用new AbstractMap.SimpleEntry<Integer, MyObj>(i, obj) for java 8

    【讨论】:

    • 谢谢!我就知道是这样的
    猜你喜欢
    • 1970-01-01
    • 2020-05-20
    • 2022-01-14
    • 2022-01-21
    • 1970-01-01
    • 2019-07-15
    • 2021-10-05
    相关资源
    最近更新 更多