Группировать путем подсчета в Java 8 stream API

Я пытаюсь найти простой способ в Java 8 stream API для группировки, я выхожу с этим сложным способом!

List list = new ArrayList(); list.add("Hello"); list.add("Hello"); list.add("World"); Map<String, List> collect = list.stream().collect( Collectors.groupingBy(o -> o)); System.out.println(collect); List 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])); 

Я ценю ваш вклад.

Я думаю, вы просто ищете перегрузку, которая берет другой Collector чтобы указать, что делать с каждой группой … и затем Collectors.counting() чтобы выполнить подсчет:

 import java.util.*; import java.util.stream.*; class Test { public static void main(String[] args) { List list = new ArrayList<>(); list.add("Hello"); list.add("Hello"); list.add("World"); Map counted = list.stream() .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())); System.out.println(counted); } } 

Результат:

 {Hello=2, World=1} 

(Существует также возможность использования groupingByConcurrent для большей эффективности. Что-то нужно помнить для вашего реального кода, если это будет безопасно в вашем контексте.)

  List list = new ArrayList<>(); list.add("Hello"); list.add("Hello"); list.add("World"); Map> collect = list.stream().collect( Collectors.groupingBy(o -> o)); System.out.println(collect); collect.entrySet().forEach(e -> System.out.println(e.getKey() + " >> " + e.getValue().size())); 

Вот простое решение StreamEx

 StreamEx.of(list).groupingBy(Function.identity(), Collectors.countingInt()); 

Уменьшите код шаблона: collect(Collectors.

Вот пример для списка объектов

 Map requirementCountMap = requirements.stream().collect(Collectors.groupingBy(Requirement::getRequirementType, Collectors.counting())); 

Вот несколько разных вариантов для выполнения поставленной задачи.

используя toMap :

 list.stream() .collect(Collectors.toMap(Function.identity(), e -> 1, Math::addExact)); 

используя Map::merge :

 Map accumulator = new HashMap<>(); list.forEach(s -> accmulator.merge(s, 1, Math::addExact)); 
  • Начало работы с Haskell
  • «Закрытие - это объекты бедного человека и наоборот». Что это значит?
  • Функциональное программирование на Java
  • Разделить stream Java 8
  • Переполнение стека из глубокой рекурсии в Java?
  • Почему java.util.Collection не реализует новый интерфейс Stream?
  • В чем разница между def foo = {} и def foo () = {} в Scala?
  • Объединение двух списков в Haskell
  • Связать Vs Лямбда?
  • java lambda возвращает лямбду
  • Функциональное реактивное программирование в Scala
  • Давайте будем гением компьютера.