我正在尝试使用 Java 8 修改我的一些方法,使它们更加简洁,我正在尝试慢慢吸收其新功能。
这是一个以添加value
为目的的方法到 Map<Key, Set<Value>>
.存在三种可能性:
- 键不存在:它被添加并且包含该值的新集合与其相关联。
- 键存在:值被添加到现有集合中。请注意,集合永远不会是
null
,因为我有一些先决条件来处理它。 - 键存在且值已包含在集合中:
IllegalArgumentException
被抛出。
实现此行为的代码如下,它不使用 Java 8 功能:
public void addValue(Key key, Value value) {
// irrelevant preconditions...
Set<Value> valuesForKey = myMap.get(key);
if (valuesForKey != null && valuesForKey.contains(value))
throw new IllegalArgumentException("Association exists already");
if (valuesForKey == null)
myMap.put(key, new HashSet<Value>(Arrays.asList(value)));
else
valuesForKey.add(value);
}
我想使用 Java 8 方法缩短此代码,例如 computeIfAbsent .
我可以总结最后一个if-else
block ,但我无法通过 key
设置的值的冗余映射到在执行前提条件检查时已经被检索。
public void addValue(Key key, Value value) {
// irrelevant preconditions...
Set<Value> valuesForKey = myMap.get(key);
if (valuesForKey != null && valuesForKey.contains(value))
throw new IllegalArgumentException("Association exists already");
myMap.computeIfAbsent(key, v -> new HashSet<Value>()).add(value);
}
无论如何我可以将所有这些合并到一条指令中吗?
最佳答案
您可以利用 add(element)
如果集合不包含指定的元素,方法将返回 true
。如果此调用返回 false
,则表示未添加该元素,因为它已经存在。因此,您可以使用:
public void addValue(Key key, Value value) {
boolean added = myMap.computeIfAbsent(key, k -> new HashSet<>()).add(value);
if (!added) {
throw new IllegalArgumentException("Association exists already");
}
}
关于java - 重新设计方法以使用 Java 8 Map.computeIfAbsent() 并抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37277814/