在computeIfPresent之后如何使用forEach
我有这段代码,我想forEach在computeIfpresent函数后使用。主要是,如果找到了键,那么我们应该遍历值(列表),并获取每个条目并将其添加到另一个列表中。知道我该怎么做吗?
List<Long> myArrayList = new ArrayList();
Map<Long, Set<Long>> myMap = new HashMap();
Set<Long> mySet = MyMap().get(id);
if (mySet != null)
{
for (Long ex : mySet)
{
myArrayList.add(ex);
}
}
-->??
myMap.computeIfPresent(id, (key, value) -> value.forEach(ex -> myArrayList.add(ex)));
回答
computeIfPresent用于更改HashMap给定键下的值(id在您的情况下)。这意味着不允许这样的操作,因为通过forEach在 key:value 对上运行,您不会为地图提供任何新的映射值
你可以做的是
myMap.computeIfPresent("a", (k, v) -> {
((Set<Long>)v).forEach(e -> myArrayList.add(e));
return v;
});
但它看起来很糟糕并且违反了computeIfPresent方法的目的
你应该使用相当传统的方法
if (myMap.containsKey(id)) {
myArrayList.addAll(myMap.get(id));
}
或使用 Optional
Optional.ofNullable(map.get(id)).ifPresent(set ->
myArrayList.addAll((Set<Long>)set)
);
...但这更易读吗?:)