为了账号安全,请及时绑定邮箱和手机立即绑定

从根据 List<String> 过滤的嵌套 HashMap<String, HashMap

从根据 List<String> 过滤的嵌套 HashMap<String, HashMap

慕容708150 2023-09-27 21:24:43
我有一个嵌套的 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>.正在寻找一款使用 的单衬管stream()。
查看完整描述

2 回答

?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

像这样的东西应该有效:


    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。


警告:我觉得如果没有流的选项更干净并且能完成工作,我会选择它。鉴于这里需要的操作相当复杂,从长远来看,保持其可读性比巧妙的做法更有好处。


查看完整回答
反对 回复 2023-09-27
?
jeck猫

TA贡献1909条经验 获得超7个赞

get另一种稍微改进当前答案的方法可能是在没有检查的情况下不执行 a isPresent。filter这可以通过使用和来实现map


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


查看完整回答
反对 回复 2023-09-27
  • 2 回答
  • 0 关注
  • 61 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信