boolean (@NotNull K key, @NotNull Collection<? extends V> expectedValue, @NotNull Collection<? extends V> newValue) { ConcurrentMap<K, Object> map = (ConcurrentMap<K, Object>)myMap; Object newValueToPut = newValue.isEmpty() ? null : newValue.size() == 1 ? newValue.iterator().next() : new ValueList<Object>(newValue); Object oldValue = map.get(key); List<V> oldCollection = rawValueToCollection(oldValue); if (!oldCollection.equals(expectedValue)) return false; if (oldValue == null) { return newValueToPut == null || map.putIfAbsent(key, newValueToPut) == null; } if (newValueToPut == null) { return map.remove(key, oldValue); } return map.replace(key, oldValue, newValueToPut); }