Я хочу преобразовать массив целых чисел в
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 подтверждает функцию"
оцените любые указатели, чтобы решить эту проблему




Вам нужно поместить 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), изменив его
@Буддхи, нет, должно быть ...Collectors.toMap(e->e,v->1)...
@HadiJ, но в этом конкретном случае вам понадобится Collectors.toMap(e->e, v->1, Integer::sum) для обработки дубликатов.
@Holger, да, я имел в виду это ...toMap(e->e,1). спасибо за очистку
Вы должны вызвать .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.
Arrays.stream(nums).boxed().collect(Collectors.toMap(Function.identity(), i -> 1, Integer::sum));