【问题标题】:generating map from list of objects having a map using java lambda8使用 java lambda8 从具有映射的对象列表生成映射
【发布时间】:2018-12-05 23:33:25
【问题描述】:

我有一个对象,

class Object2{
     String name;
     String id;
     Map<String, String> customData;
}

class Object1{
     List<Object2> obj1List;
}

我想将 object1 列表中的这个 customData 映射转换为一个映射,如果键已经存在,我可以覆盖值。

【问题讨论】:

    标签: java lambda java-8 java-stream


    【解决方案1】:

    这是一种使用 lambda 和 Java 8 的方法:

    Map<String, String> map = new LinkedHashMap<>();
    object1List.forEach(o1 -> 
            o1.getObject1List().forEach(o2 -> map.putAll(o2.getCustomData())));
    

    【讨论】:

    • 问题中有奇怪的命名约定,但我猜你的意思是getObject1List()
    【解决方案2】:

    如下使用flatMap和toMap:

    List<Object1> source = ...
    Map<String, String> result = 
         source.stream()
               .flatMap(e -> e.getObj1List().stream()
                                   .flatMap(a -> a.getCustomData().entrySet().stream()))
               .collect(toMap(Map.Entry::getKey, Map.Entry::getValue, (l, r) -> r));
    

    或者,如果您正在处理单个 Object1 对象:

    Object1 myObj = ...
    Map<String, String> result = 
          myObj.getObj1List()
               .stream()
               .flatMap(a -> a.getCustomData().entrySet().stream())
               .collect(toMap(Map.Entry::getKey, Map.Entry::getValue, (l, r) -> r));
    

    【讨论】:

      【解决方案3】:

      或者,您可以执行Stream.flatMap,然后将Map.putAll 用作

      List<Object1> object1s = new ArrayList<>(); // initialise as you would
      Map<String, String> finalCustomData = new LinkedHashMap<>();
      object1s.stream() // Stream<Object1>
              .flatMap(o1 -> o1.getObj1List().stream()) // Stream<Object2>
              .map(Object2::getCustomData) // Stream<Map<String, String>>
              .forEach(finalCustomData::putAll); 
      

      【讨论】:

        猜你喜欢
        • 2018-12-02
        • 2021-10-28
        • 2018-06-18
        • 1970-01-01
        • 1970-01-01
        • 2023-03-18
        • 1970-01-01
        • 1970-01-01
        • 2014-11-02
        相关资源
        最近更新 更多