映射ifPresent函数

Thi*_*ler 8 java lambda dictionary java-8

如果地图的值存在,如何才能对地图的值执行,而不对地图进行任何更改?我希望使用'Java 8'声明式样式来做到这一点Optional.ifPresent().

我的用例如下:

我收到部分对象的更新(新的或删除的),我想与他们的父级注册这些更新.对于簿记,我有以下内容:

Map<ParentId, Parent> parents = ...
Run Code Online (Sandbox Code Playgroud)

收到新孩子时,我会做以下事情:

parents.computeIfAbsent(child.getParentId(), k -> new Parent()).addChild(child));
Run Code Online (Sandbox Code Playgroud)

但是为了删除我找不到声明函数.直截了当我将其实现为:

if(parents.containsKey(child.getParentId())
{
     parents.get(child.getParentId()).removeChild(child);
}
Run Code Online (Sandbox Code Playgroud)

或者我可以将值包装在Optional:

Optional.ofNullable(parents.get(child.getParentId()).ifPresent(p -> p.removeChild(child));
Run Code Online (Sandbox Code Playgroud)

请注意,Parent不是一个简单的列表,它包含的不仅仅是子项.所以以下不起作用(因为removeChild()不返回a Parent):

parents.computeIfPresent(child.getParentId(), (k, v) -> v.removeChild());
Run Code Online (Sandbox Code Playgroud)

我怎么能这样做,或者没有相应的Optional.ifPresent()

dan*_*niu 6

我认为您的Optional解决方案看起来不错,但是对于

以下不起作用(因为removeChild()不返回父): parents.computeIfPresent(child.getParentId(), (k, v) -> v.removeChild());

你可以将lambda扩展到

parents.computeIfPresent(child.getParentId(), (k, v) -> { v.removeChild(); return v; });
Run Code Online (Sandbox Code Playgroud)

我会说直截了当的方式在这种情况下是最清楚的,但我会顺其自然.

  • 值得注意的是,即使这个`computeIfPresent`有效地使用不会改变映射,不可变映射也可能会用`UnsupportedOperationException`拒绝它,甚至不检查函数是否会计算为新值. (2认同)