How to collect the results of a Stream in a primitive array?

Alex Quilliam picture Alex Quilliam · Jun 1, 2017 · Viewed 7.2k times · Source

I'm trying to convert 2D list to a 2D int array. However, it seems I can only collect objects, not primitives.

When I do:

data.stream().map(l -> l.stream().toArray(int[]::new)).toArray(int[][]::new);

I get the compile-time error Cannot infer type argument(s) for <R> map(Function<? super T,? extends R>).

However, if I change int[] to Integer[], it compiles. How can I get it to just use int?

Answer

Sergey Kalinichenko picture Sergey Kalinichenko · Jun 1, 2017

Use mapToInt method to produce a stream of primitive integers:

int[][] res = data.stream().map(l -> l.stream().mapToInt(v -> v).toArray()).toArray(int[][]::new);

The inner toArray call no longer needs int[]::new, because IntStream produces int[].

Demo.