我需要迭代和计算嵌套Map <key,someobjectarray [] =“”>

时间:2019-02-12 19:02:27

标签: java lambda java-8 java-stream

我需要使用Key和List迭代Map以提供另一种类型的对象。我试图在代码级别进行解释。

我尝试了for循环,效果很好。但是我喜欢Java8流式传输

public Map<String, List<TestClassResult>> getComputed(
    Map<String, SourceClass[]> sourceMapObject) {

Map<String, List<TestClassResult>> response = new HashMap<>();
// Here goes the functionality
List<TestClassResult> result;
for (Map.Entry<String, SourceClass[]> entry : sourceMapObject.entrySet()) {
      result = new ArrayList<>();
      String key = entry.getKey();
      for (SourceClass value : entry.getValue()) {
        result.add(someMethod(value.id, value.empCode));
      }
      response.put(key, result);
    }
return response;
}

public class SourceClass{
   private String id;
   private String empCode;
}

public class TestClassResult{
   private String empName;
   private String empMartial;
   private int empAge;
}

我需要使用Java 8流和lambda来实现

1 个答案:

答案 0 :(得分:3)

sourceMapObject.entrySet()
                .stream()
                .collect(Collectors.toMap(
                     Entry::getKey,
                     entry -> Arrays.stream(entry.getValue())
                                   .map(value -> someMethod(value.id, value.empCode))
                                   .collect(Collectors.toList()),
                     (left, right) -> right                                          
))

如果您确定不会重复,则可以省略(left, right) -> right部分。但是,由于在您现有的代码中,您拥有response.put(key, result);,因此我将其保留为与该代码保持一致。

这里的要点是Map::put将覆盖您在Map中已经拥有的先前值,而Collectors::toMap 的合并将抛出一个例外。另一方面,对于(left, right) -> right,它的行为就像put