Я использую параллельную хеш-карту следующим образом:
private final Map<String, List<FooObject>> map = new ConcurrentHashMap<>();
Я использую список моих настраиваемых объектов в качестве значения. Когда приложение запущено, и мне нужно сохранить какой-то объект в List для определенного ключа на карте, мне нужно сначала проверить, есть ли какое-то значение (List) для этого ключа:
FooObject foo = new Foo(...);
if (map.get(key) == null) {
map.putIfAbsent(key, Lists.newArrayList(foo))
} else {
map.get(key).add(foo);
}
Мой вопрос: есть ли способ написать более простой код? С какой-то функцией Java 8? Я также использую гуаву и пружину в проекте, поэтому, если в этих фреймворках есть какая-то утилита, мне все равно подходит. Спасибо.
@ MạnhQuyếtNguyễn оу, я думал, когда я использую ConcurrentHashMap, объекты в нем будут также потокобезопасными: /
Получение / установка значений Map, а не их содержимого, является потокобезопасным.
@ MạnhQuyếtNguyễn спасибо за предупреждение ... Я нашел FastArrayList commons.apache.org/proper/commons-collections/javadocs/…, как вы думаете, это хорошая альтернатива?
@DenisStephanov Я считаю, что лучший способ устранить это if-else - заменить его на map.computeIfAbsent(key, k -> new ArrayList<>()).add(foo);
@DenisStephanov А, я только что прочитал, что вам нужен параллелизм. Тогда, возможно, мой комментарий выше не совсем уместен. :) Согласно этому комментарию Guava: github.com/google/guava/issues/135#issuecomment-306172853, использование CopyOnWriteArrayList поверх FastArrayListдолжен Apache Commons Collections будет прекрасным.
@DenisStephanov В качестве альтернативы мне кажется, что вы пытаетесь создать одновременную мультикарту, поэтому Multimaps.synchronizedListMultimap(MultimapBuilder.hashKeys().arrayListValues().build()) Guava может работать в вашем случае. :)




Когда вы вызываете
map.get(key).add(foo);, вы создаете проблему параллелизма, потому что вашListне синхронизирован.