Преобразование массива в карту индекса массива в значение

Что не так с этим кодом?

int[] nums = new int[] {8, 3, 4};
Map<Integer,Integer> val2Idx = 
    IntStream.range(0, nums.length)
        .collect(Collectors.toMap(idx -> idx, idx -> nums[idx]));

Я надеюсь создать Map со следующими значениями:

{0=8, 1=3, 2=4}

Но ошибка

метод collect в интерфейсе IntStream не может быть применен к заданным типам;

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
448
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Вам нужно вставить ints в Integers:

Map<Integer,Integer> val2Idx =
    IntStream.range(0, nums.length)
             .boxed() // Here!
             .collect(Collectors.toMap(idx -> idx, idx -> nums[idx]));

Просто чтобы добавить некоторое обоснование: основная проблема заключается в том, что IntStream не имеет метода, подобного collect(Collector), а только collect​(Supplier<R> supplier, ObjIntConsumer<R> accumulator, BiConsumer<R,​R> combiner), поэтому Collectors.toMap не рассматривается как правильный аргумент, поэтому у него даже нет возможности сделать вывод, что idx есть int. Простое исправление заключается в использовании версии Stream, которая имеет этот метод и может быть легко создана, как показано в ответе.

Pshemo 12.12.2020 21:42

Альтернативное исправление будет предоставлять все 3 обязательных параметра, например .collect( HashMap::new, (map, index) -> map.put(index, nums[index]), (mainMap, otherMap) -> mainMap.putAll(otherMap) );

Pshemo 12.12.2020 21:48

IntStream#collect требует три аргумента; если вы хотите использовать версию с двумя аргументами, вы должны использовать IntStream#boxed, чтобы преобразовать ее в Stream<Integer>.

int[] nums = new int[] {8, 3, 4};
Map<Integer,Integer> val2Idx = 
    IntStream.range(0, nums.length).boxed()
        .collect(Collectors.toMap(idx -> idx, idx -> nums[idx]));
System.out.println(val2Idx);

Эта ошибка связана с тем, что idx это объект, а не целое число

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