我正在尝试使用Java 8重做我的一些方法,以使其更加简洁,我正在尝试逐渐吸收其新功能。
这是一种将a添加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
块,但是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");
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句