如果地图的值存在,如何才能对地图的值执行,而不对地图进行任何更改?我想使用'Java 8'声明式样式,与Optional.ifPresent()
相比。
我的用例如下:
我收到部分对象的更新(新的或删除的),我想与他们的父级注册这些更新。对于簿记,我有以下内容:
Map<ParentId, Parent> parents = ...
收到新孩子时,我会做以下事情:
parents.computeIfAbsent(child.getParentId(), k -> new Parent()).addChild(child));
但是为了删除我找不到声明函数。直截了当我将其实现为:
if(parents.containsKey(child.getParentId())
{
parents.get(child.getParentId()).removeChild(child);
}
或者我可以将值包装在Optional
中:
Optional.ofNullable(parents.get(child.getParentId()).ifPresent(p -> p.removeChild(child));
请注意,Parent不是一个简单的列表,它包含的不仅仅是子项。所以以下不起作用(因为removeChild()
不返回Parent
):
parents.computeIfPresent(child.getParentId(), (k, v) -> v.removeChild());
我怎么能这样做,或者没有相当于Optional.ifPresent()
?
我认为你的Optional
解决方案看起来不错,但对于
以下不起作用(因为removeChild()不返回父):
parents.computeIfPresent(child.getParentId(), (k, v) -> v.removeChild());
你可以将lambda扩展到
parents.computeIfPresent(child.getParentId(), (k, v) -> { v.removeChild(); return v; });
我会说直截了当的方式在这种情况下是最清楚的,但我会顺其自然。
如果创建不必要的父级没有副作用,并且通过删除缺少的子级没有抛出异常,则可以使用:
parents.getOrDefault(child.getParentId(), new Parent()).removeChild(child);