tl; др
personFavoriteColors.computeIfAbsent(
"Alice" ,
( x -> new CopyOnWriteArrayList<>() )
)
.add( "Purple" )
;
personFavoriteColors.computeIfAbsent(
"Alice" ,
( x -> new CopyOnWriteArrayList<>() )
)
.add( "Gold" )
;
personFavoriteColors.toString (): [Фиолетовый, Золотой]
Map::computeIfAbsent
Java теперь имеет поведение multimap , встроенное в новый метод computeIfAbsent
, определенный в интерфейсе Map
.
Определите вашу карту.
ConcurrentMap< String , Set< String> > personFavoriteColors = new ConcurrentSkipListMap<>() ;
Мы используем реализацию Map
, которая реализует интерфейс ConcurrentMap
для обеспечения безопасности потоков, как вы и просили. Java предлагает две такие реализации.
Используйте одну строку для создания нового списка или набора для хранения нескольких значений.
personFavoriteColors.computeIfAbsent(
"Alice" ,
( x -> new CopyOnWriteArraySet<>() ) // Lambda expression. Run only if needed to run (if absent).
) // Returns the value of a map (a `Set` or `List` when desiring a multimap).
.add( "Purple" )
;
Вы можете получить доступ к Set
(или List
) за пределами Map
, которому он принадлежит. Так что Set
(или List
) также должны быть параллельными.
Здесь мы использовали параллельный набор, CopyOnWriteArraySet
в качестве значения карты.
Например:
Set< String > favoriteColorsForAlice = personFavoriteColors.get( "Alice" ) ;
System.out.println( favoriteColorsForAlice ) ;
Смотрите это код работает на IdeOne.com .
[фиолетовый, золотой]