Массив целых чисел Java 8 для сопоставления

Я хочу преобразовать массив целых чисел в

Map<Integer,Integer> 

с использованием потокового API Java 8

int[] nums = {2, 7, 11, 15, 2, 11, 2};
Map<Integer,Integer> map=Arrays
                .stream(nums)
                .collect(Collectors.toMap(e->e,1));

Я хочу получить карту, как показано ниже, ключ будет целочисленным значением, значение будет общим количеством каждого ключа

map = {2->3, 7->1, 11->2, 15->1}

компилятор жалуется "не существует экземпляра (ов) переменной (ов) типа T, U, так что Integer подтверждает функцию"

оцените любые указатели, чтобы решить эту проблему

Arrays.stream(nums).boxed().collect(Collectors.toMap(Functio‌​n.identity(), i -> 1, Integer::sum));
Hadi J 01.06.2019 14:21
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
1
5 370
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вам нужно поместить IntStream, а затем использовать значение groupingBy, чтобы получить счет:

Map<Integer, Long> map = Arrays
        .stream(nums)
        .boxed() // this
        .collect(Collectors.groupingBy(e -> e, Collectors.counting()));

или используйте reduce как:

Map<Integer, Integer> map = Arrays
        .stream(nums)
        .boxed()
        .collect(Collectors.groupingBy(e -> e,
                Collectors.reducing(0, e -> 1, Integer::sum)));

Спасибо за ответ, если значение карты равно 1 вместо количества ключей, можно ли использовать Collectors.toMap(e->e,1), изменив его

Buddhi 01.06.2019 14:28

@Буддхи, нет, должно быть ...Collectors.toMap(e->e,v->1)...

Hadi J 01.06.2019 14:39

@HadiJ, но в этом конкретном случае вам понадобится Collectors.toMap(e->e, v->1, Integer::sum) для обработки дубликатов.

Holger 03.06.2019 12:09

@Holger, да, я имел в виду это ...toMap(e->e,1). спасибо за очистку

Hadi J 03.06.2019 12:20

Вы должны вызвать .boxed() в своем потоке, чтобы преобразовать IntStream в Stream<Integer>. Затем вы можете использовать Collectors.groupingby() и Collectors.summingInt() для подсчета значений:

Map<Integer, Integer> map = Arrays.stream(nums).boxed()
        .collect(Collectors.groupingBy(Function.identity(), Collectors.summingInt(i -> 1)));

Вы также можете выполнить подсчет целых чисел, не помещая значения int в Map<Integer, Integer> или Map<Integer, Long>. Если вы используете Коллекции Затмения, вы можете преобразовать IntStream в IntBag следующим образом.

int[] nums = {2, 7, 11, 15, 2, 11, 2};
IntBag bag = IntBags.mutable.withAll(IntStream.of(nums));
System.out.println(bag.toStringOfItemToCount());

Выходы:

{2=3, 7=1, 11=2, 15=1}

Вы также можете создать IntBag непосредственно из массива int.

IntBag bag = IntBags.mutable.with(nums);

Примечание. Я коммиттер Eclipse Collections.

Другие вопросы по теме