См. простой пример ниже, который подсчитывает количество вхождений каждого слова в списке:
Stream<String> words = Stream.of("a", "b", "a", "c");
Map<String, Integer> wordsCount = words.collect(toMap(s -> s, s -> 1,
(i, j) -> i + j));
В конце < <21 > {a=2, b=1, c=1}
.
Но мой поток очень большой, и я хочу распараллелить работу, поэтому пишу:
Map<String, Integer> wordsCount = words.parallel()
.collect(toMap(s -> s, s -> 1,
(i, j) -> i + j));
Однако я заметил, что wordsCount
является простым HashMap
, поэтому я задаюсь вопросом, нужно ли мне явно запрашивать параллельную карту для обеспечения безопасности потоков:
Map<String, Integer> wordsCount = words.parallel()
.collect(toConcurrentMap(s -> s, s -> 1,
(i, j) -> i + j));
Можно ли безопасно использовать неконкурентные коллекторы с параллельным потоком или использовать только параллельные версии при сборе из параллельного потока?