使用String和List <object1>迭代Map并替换为List <object2>

时间:2019-02-10 23:19:34

标签: java java-8 java-stream

我正在尝试使用Streaming概念在Java中处理HashMap。

问题:

public class SourceClass{
    private String EmpId;
    private String EmpName;
}

public class ResultClass{
    private  String EmpId;
    private  String EmpAddress;
    private  String EmpMartialStatus;
    private  Integer EmpAge;
}

我有2个类,将在以下方法中用作列表。

现在,我应该处理此Map,并使用SourceClass值获取需要拥有其主数据的ResultClass值。因此响应应该如下。

 sourceClasseMap = { "doj1", 
                   <[EmpId1, EmpName1],                  
                    [EmpId1, EmpName1]> 
          }

我的结果应该像

return ResultClassMap = { "doj1", 

   <[EmpId1, EmpAddress1, EmpMartialStatus1, EmpAge1],                                           
  [EmpId2, EmpAddress2, EmpMartialStatus2, EmpAge2]> 
}

方法看起来像

public Map<String, List<ResultClass>> getStausesForDevices(Map<String, SourceClass[]> sourceClasseMap){

    Expecting to use Java 8 Stream concept.
    Expecting to use Java 8 Stream concept.

1 个答案:

答案 0 :(得分:1)

假设

  

ResultClass = jedis.get(SourceClass.EmpId1 + SourceClass.EmpName1)

如果您不受java8的限制,那么可以使用java9中的flatMapping方法进行流传输。

public Map<String, List<ResultClass>> getStausesForDevices(Map<String, SourceClass[]> sourceClassMap) {

    return sourceClassMap.entrySet().stream()
            .collect(groupingBy(Map.Entry::getKey,
                    flatMapping(entry -> Arrays.stream(entry.getValue()),
                            mapping(source -> jedis.get(source.getEmpId() + source.getEmpName()), toList()))));

}

更新

如果您不能使用java9,那么没有flatMapping的解决方案:

return sourceClassMap.entrySet().stream()
        .collect(toMap(Map.Entry::getKey, entry -> Arrays.stream(entry.getValue())
                .map(source -> jedis.get(source.getEmpId() + source.getEmpName()))
                .collect(toList())));