【发布时间】:2018-06-03 20:21:51
【问题描述】:
如何仅在地图值存在的情况下对地图值执行函数,而不对地图进行任何更改?我想使用类似于Optional.ifPresent() 的“Java 8”声明式风格来做到这一点。
我的用例如下:
我收到部分对象的更新(新的或删除的),我想向其父对象注册这些更新。对于簿记,我有以下内容:
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()的?
【问题讨论】:
-
他们使用可选的方式可能是我能想到的最简单和最干净的方法
-
当父母最终没有孩子时会发生什么?您是否还需要从地图中删除该父级,或者如果父级仍然没有子级,是否可以?
-
@FedericoPeraltaSchaffner 此示例中没有任何内容(在我的情况下,因为还有其他数据必须保存)。
标签: java dictionary lambda java-8