【问题标题】:Get HashMapsValues from nested HashMap<String, HashMap<String, String>> filtered against a List<String>从针对 List<String> 过滤的嵌套 HashMap<String, HashMap<String, String>> 获取 HashMapsValues
【发布时间】:2019-10-05 15:01:36
【问题描述】:

我有一个嵌套的 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&lt;String&gt; 中提取字符串属性。

寻找使用stream() 的单班轮。

【问题讨论】:

  • Part 的定义是什么?你从哪里得到itemIditemIdpartId 一样吗?
  • 此代码是 SOA 代码的一部分。 Part 可以被认为是任何 POJO 对象。

标签: java hashmap java-stream


【解决方案1】:

这样的事情应该可以工作:

    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));

我使用AbstractMap 中的SimpleEntry 类来携带Part 的上下文以及我们找到的映射到下一个操作-collect

警告:我觉得如果没有流的选项更清洁并且可以完成工作,我会接受。鉴于您在这里需要的操作相当复杂,从长远来看,保持它的可读性比一些聪明的东西更有好处。

【讨论】:

    【解决方案2】:

    稍微改进当前答案的另一种方法可能是在没有isPresent 检查的情况下不执行get。这可以通过使用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));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-27
      • 1970-01-01
      • 2014-08-27
      • 2018-10-20
      • 2011-12-11
      • 2021-11-13
      • 2013-10-05
      相关资源
      最近更新 更多