Convert IntStream to Map

16,931

Here is my code, it will work for you.

Function Reference version

public class AppLauncher {

public static void main(String a[]){
    Map<Integer,Integer> map = IntStream.range(1,10).boxed().collect(Collectors.toMap(Function.identity(),AppLauncher::computeSmth));
    System.out.println(map);
}
  public static Integer computeSmth(Integer i){
    return i*i;
  }
}

Lambda expression version

public class AppLauncher {

    public static void main(String a[]){
        Map<Integer,Integer> map = IntStream.range(1,10).boxed().collect(Collectors.toMap(Function.identity(),i->i*i));
        System.out.println(map);
    }
}
Share:
16,931

Related videos on Youtube

maks
Author by

maks

Updated on September 14, 2022

Comments

  • maks
    maks over 1 year

    I have an IntStream and want for each element of that stream to do some calculations and return them as Map where keys are int values and values are result of that computations. I wrote following piece of code:

    IntStream.range(0,10)
        .collect(
            Collectors.toMap(Function.identity(), i -> computeSmth(i)));
    

    where computeSmth(Integer a). I got next compiler error

    method collect in interface java.util.stream.IntStream cannot be applied to given types;
     required: java.util.function.Supplier<R>,java.util.function.ObjIntConsumer<R>,java.util.function.BiConsumer<R,R>
     found: java.util.stream.Collector<java.lang.Object,capture#1 of ?,java.util.Map<java.lang.Object,java.lang.String>>
     reason: cannot infer type-variable(s) R
       (actual and formal argument lists differ in length)
    

    What I'm doing wrong?

    • Misha
      Misha almost 8 years
      IntStream only has the 3-argument collect. You should either rewrite your toMap in 3-arument form or convert IntStream to Stream<Integer> with .boxed()
  • user1075613
    user1075613 over 6 years
    indeed, .boxed() was the key to success !