我正在尝试重新设计我的一些方法,以便使用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);
}
我想使用像computeIfAbsent这样的Java 8方法来缩短这段代码。
我可以总结最后一个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);
}
不管怎么说,我可以把所有这些合并在一条指令里吗?
发布于 2016-05-17 13:44:21
您可以利用这样的事实:如果集合不包含指定的元素,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");
}
}
https://stackoverflow.com/questions/37277814
复制相似问题