Я пытаюсь найти простой способ в Java 8 stream API, чтобы сделать группировку, я вышел с этим сложным способом!
List<String> list = new ArrayList<>();
list.add("Hello");
list.add("Hello");
list.add("World");
Map<String, List<String>> collect = list.stream().collect(
Collectors.groupingBy(o -> o));
System.out.println(collect);
List<String[]> collect2 = collect
.entrySet()
.stream()
.map(e -> new String[] { e.getKey(),
String.valueOf(e.getValue().size()) })
.collect(Collectors.toList());
collect2.forEach(o -> System.out.println(o[0] + " >> " + o[1]));
Я ценю ваш вклад.
java
functional-programming
java-8
Мухаммед Хьюди
источник
источник
Ответы:
Я думаю, что вы просто ищете перегрузку, которая требует другого,
Collector
чтобы указать, что делать с каждой группой ... и затемCollectors.counting()
выполнить подсчет:Результат:
(Существует также возможность использования
groupingByConcurrent
для большей эффективности. Что-то, что нужно иметь в виду для вашего реального кода, если это будет безопасно в вашем контексте.)источник
and then performing a reduction operation on the values associated with a given key using the specified downstream Collector
Map<String, Long> counted = list.stream() .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
, что именно происходит в этот момент, и любые ссылки с дополнительным объяснением, связанные с темой, которую можно отправить болееисточник
Вот пример для списка объектов
источник
Вот несколько разных вариантов выполнения поставленной задачи.
используя
toMap
:используя
Map::merge
:источник
Вот простое решение от StreamEx
Уменьшить шаблон кода:
collect(Collectors.
источник
Если вы открыты для использования библиотеки сторонних производителей , вы можете использовать
Collectors2
класс в Eclipse , Collections преобразоватьList
кBag
используяStream
. ABag
- это структура данных, созданная для подсчета .Вывод:
В данном конкретном случае, вы можете просто непосредственно в .
collect
List
Bag
Вы также можете создать
Bag
без использованияStream
, адаптировавList
с протоколами Eclipse Collections.или в данном конкретном случае:
Вы также можете просто создать мешок напрямую.
A
Bag<String>
какMap<String, Integer>
в том, что он внутренне отслеживает ключи и их количество. Но, если вы спроситеMap
ключ, которого он не содержит, он вернетсяnull
. Если вы спроситеBag
ключ, он не содержит использованиеoccurrencesOf
, он вернет 0.Примечание: я являюсь коммиттером для Eclipse Collections.
источник