映射ifPresent函数

时间:2017-12-21 07:43:32

标签: java dictionary lambda java-8

如果地图的值存在,如何才能对地图的值执行,而不对地图进行任何更改?我想使用'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()

2 个答案:

答案 0 :(得分:5)

我认为您的public CountryIssuingListAdapter(Context mContext, ArrayList<Country> itemArrayList, CountryPhoneCodeAdapter.OnItemClickListener listener) { this.countryArrayList = itemArrayList; this.countryArrayListForSearch = new ArrayList<>(); this.countryArrayListForSearch.addAll(itemArrayList); this.mContext = mContext; this.TAG = mContext.getClass().getSimpleName(); this.mRootView = ((Activity)mContext).getWindow().getDecorView().findViewById(R.id.activity_country_search); this.listener = listener; } 解决方案看起来不错,但是对于

  

以下不起作用(因为removeChild()不返回Parent):   Optional

你可以将lambda扩展到

parents.computeIfPresent(child.getParentId(), (k, v) -> v.removeChild());

我会说直截了当的方式在这种情况下是最清楚的,但我会选择。

答案 1 :(得分:1)

如果创建不必要的父级没有副作用,并且通过删除缺席的孩子不会引发异常,则可以使用:

parents.getOrDefault(child.getParentId(), new Parent()).removeChild(child);