我有一个嵌套的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()
寻找一个班轮。
答案 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
。这可以通过使用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));