从针对List <String>筛选的嵌套HashMap <String,HashMap <String,String >>获取HashMapsValues

时间:2019-10-05 15:01:36

标签: java hashmap java-stream

我有一个嵌套的String HashMap和一个对象列表。该对象具有String属性,可以与内部HashMap的值进行匹配。

我正尝试使用stream()Collectors来查找下面的Java代码

HashMap<String, HashMap<String, String>>PartDetailsHMap=new HashMap<String, HashMap<String, String>>()
List<Part> partList=new ArrayList<Part>();


for(int i=0;i<partList.size();i++)
    String partId = partList.get(i).getPropertyValue("part_id");
    for(HashMap< String, String> PartPropsHMap:PartDetailsHMap.values())
    {
        if(PartPropsHMap.containsValue(itemId))
        {
            collectingPartMap.put(partList.get(i), PartPropsHMap);
            break;
        }
    }
}

如果需要,我可以在List<String>中提取String属性。

使用stream()寻找一个班轮。

2 个答案:

答案 0 :(得分:3)

类似的事情应该起作用:

    Map<String, Map<String, String>> PartDetailsHMap = new HashMap<>();
    List<Part> partList = new ArrayList<>();

    Map<Part, Map<String, String>> collectingPartMap = partList.stream()
      .map(part -> PartDetailsHMap.values()
        .stream()
        .filter(partPropsHMap -> partPropsHMap.containsValue(part.getPropertyValue("part_id")))
        .findFirst()
        .map(partPropsHMap -> new SimpleEntry<Part, Map>(part, partPropsHMap))
        .get()
      )
      .collect(toMap(Map.Entry::getKey, Map.Entry::getValue));

我使用了SimpleEntry中的AbstractMap类来携带Part的上下文以及我们发现的映射到下一个操作-collect。 / p>

注意:我认为如果没有流的选项更干净并且可以完成工作,我会同意的。鉴于您在这里需要的操作是相当复杂的,因此从长远来看,使它保持可读性比使它聪明是有益的。

答案 1 :(得分:0)

略微改善当前答案的另一种方法可能是不进行get检查就不执行isPresent。这可以通过使用filtermap

来实现
Map<Part, Map<String, String>> collectingPartMap = partList.stream()
        .map(part -> partDetailsHMap.values().stream()
                .filter(innerMap -> innerMap.containsValue(part.getPartId())) // notice 'getPartId' for the access
                .findFirst()
                .map(firstInnerMap -> new AbstractMap.SimpleEntry<>(part, firstInnerMap)))
        .filter(Optional::isPresent)
        .map(Optional::get)
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));