Я пытаюсь переработать некоторые из моих методов, чтобы сделать их более краткими, используя 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
, но я не могу обойти избыточность значения, установленного на карту 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);
}
В любом случае, я мог бы объединить все это в одну инструкцию?