Что не так с этим кодом?
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 не может быть применен к заданным типам;
Вам нужно вставить int
s в Integer
s:
Map<Integer,Integer> val2Idx =
IntStream.range(0, nums.length)
.boxed() // Here!
.collect(Collectors.toMap(idx -> idx, idx -> nums[idx]));
Альтернативное исправление будет предоставлять все 3 обязательных параметра, например .collect( HashMap::new, (map, index) -> map.put(index, nums[index]), (mainMap, otherMap) -> mainMap.putAll(otherMap) );
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
это объект, а не целое число
Просто чтобы добавить некоторое обоснование: основная проблема заключается в том, что
IntStream
не имеет метода, подобногоcollect(Collector)
, а толькоcollect(Supplier<R> supplier, ObjIntConsumer<R> accumulator, BiConsumer<R,R> combiner)
, поэтомуCollectors.toMap
не рассматривается как правильный аргумент, поэтому у него даже нет возможности сделать вывод, чтоidx
естьint
. Простое исправление заключается в использовании версииStream
, которая имеет этот метод и может быть легко создана, как показано в ответе.