【问题标题】:collect child objects to a hashmap of parentObjectId using java 8 streams使用 java 8 流将子对象收集到 parentObjectId 的哈希图
【发布时间】:2019-11-12 01:10:40
【问题描述】:
public class StreamTest {

    public static void main(String[] args){
        parentObject parentObject1 = new parentObject();
        parentObject1.setId(1);
        ArrayList<ChildObject> childObjectList = new ArrayList<ChildObject>();
        parentObject1.setChildObjectList(childObjectList);

        ChildObject childObject1 = new ChildObject();
        childObject1.setId(1);
        childObject1.setName("ce1");

        ChildObject childObject2 = new ChildObject();
        childObject2.setId(2);
        childObject2.setName("ce2");

        ChildObject childObject3 = new ChildObject();
        childObject3.setId(3);
        childObject3.setName("ce3");

        childObjectList.add(childObject1);
        childObjectList.add(childObject2);
        childObjectList.add(childObject3);

        parentObject parentObject2 = new parentObject();
        ArrayList<parentObject> parentObjectList = new ArrayList<parentObject>();
        parentObjectList.add(parentObject1);
        parentObjectList.add(parentObject2);

        parentObject2.setId(2);
        ArrayList<ChildObject> childObjectList2 = new ArrayList<ChildObject>();
        parentObject2.setChildObjectList(childObjectList2);

        ChildObject childObject4 = new ChildObject();
        childObject4.setId(4);
        childObject4.setName("ce4");

        ChildObject childObject5 = new ChildObject();
        childObject5.setId(5);
        childObject5.setName("ce5");

        ChildObject childObject6 = new ChildObject();
        childObject6.setId(6);
        childObject6.setName("ce6");

        childObjectList2.add(childObject4);
        childObjectList2.add(childObject5);
        childObjectList2.add(childObject6);


       //parentObjectID as key and childObjectList as values
        HashMap<Integer, Set<String>> parentIDchildNameMap = new HashMap<Integer, Set<String>>();
        parentObjectList.forEach(
                parentObject -> parentIDchildNameMap.put(parentObject.getId(), parentObject.getChildObjectList().stream()
                                                                                .filter(childObject -> childObject.getId()!=0)
                                                                                .map(childObject -> childObject.getName())
                                                                                .collect(toSet())));

        Set<Integer> outset = parentIDchildNameMap.keySet();

        for(Integer va : outset){
            System.out.println("key :"+ va + " value : " +parentIDchildNameMap.get(va));
        }
    }
}

我有一个parentObject,它有一个子对象列表,我想创建一个哈希图,其中父对象的 id 作为键,childObject 的名称列表作为值。我写了上面的表达式来创建它。我正在创建一个哈希图并自己放置这些值。这行得通,但有没有更好的方法来做到这一点?我可以使用 collect 直接在地图上收集它们吗?

【问题讨论】:

    标签: java collections java-8 java-stream


    【解决方案1】:

    是的,您可以使用Collectors.toMap 直接收集所需的结果。这可以通过以下方式实现:

    Map<Integer, Set<String>> parentIdChildNameMap = parentObjectList.stream()
            .collect(Collectors.toMap(ParentObject::getId, parent -> parent.getChildObjectList().stream()
                    .filter(childObject -> childObject.getId() != 0)
                    .map(ChildObject::getName)
                    .collect(Collectors.toSet()), (a, b) -> b));
    

    【讨论】:

      猜你喜欢
      • 2019-02-14
      • 2016-07-10
      • 2017-07-03
      • 2019-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-09
      相关资源
      最近更新 更多