【发布时间】:2019-08-29 12:19:19
【问题描述】:
我们的对象有“属性”;并且它们的当前状态表示为Map<String, Object>,其中的键类似于属性的名称。这些值可以有不同的类型,但我目前的任务只是处理 Boolean 属性。
除了当前状态之外,对象的“更新”也通过此类地图进行组织。
现在我必须防止当前为true 的属性被禁用(转为false)。
使用流,这在这里有效:
Set<String> currentlyEnabled = currentObjectPropertiesMap.
.entrySet()
.stream()
.filter(e -> Boolean.TRUE.equals(e.getValue()))
.map(Entry::getKey)
.collect(Collectors.toSet());
Set<String> goingDisabled = updatedObjectPropertiesMap
.entrySet()
.stream()
.filter(e -> Boolean.FALSE.equals(e.getValue()))
.map(Entry::getKey)
.collect(Collectors.toSet());
currentlyEnabled.retainAll(goingDisabled);
if (currentlyEnabled.isEmpty()) {
return;
} else {
throw new SomeExceptionThatKnowsAllBadProperties(currentlyEnabled);
}
上面的代码首先获取一组true的所有属性,然后分别收集所有将变为false的属性。而如果这两个集合的交集是空的,我很好,否则报错。
上述方法可行,但我觉得它很笨拙,而且我不喜欢 currentlyEnabled 集合被滥用来计算交集这一事实。
有什么建议可以以更惯用但可读的“流式”方式完成吗?
【问题讨论】:
-
为什么不在
currentObjectPropertiesMap.entrySet()、continue上迭代值为false的条目,否则检查updatedObjectPropertiesMap.hasKey()是否为真,如果该键的值为真,则抛出异常是false?
标签: java dictionary java-8 set java-stream