Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why can't I map integers to strings when streaming from an array?

This code works (taken in the Javadoc):

List<Integer> numbers = Arrays.asList(1, 2, 3, 4); String commaSeparatedNumbers = numbers.stream()     .map(i -> i.toString())     .collect(Collectors.joining(", ")); 

This one can't be compiled:

int[] numbers = {1, 2, 3, 4}; String commaSeparatedNumbers = Arrays.stream(numbers)     .map((Integer i) -> i.toString())     .collect(Collectors.joining(", ")); 

IDEA tells me I have an "incompatible return type String in lambda expression".

Why ? And how to fix that ?

like image 264
Denys Séguret Avatar asked Mar 13 '15 09:03

Denys Séguret


People also ask

What is the purpose of the map () method in the Stream T interface?

The map() function is a method in the Stream class that represents a functional programming concept. In simple words, the map() is used to transform one object into another by applying a function. That's the reason the Stream.

How do I turn an array into a Stream?

Program 1: Arrays. stream() to convert string array to stream. Program 2: Arrays. stream() to convert int array to stream.

Can we apply streams on Array?

stream() method only works for primitive arrays of int[], long[], and double[] type, and returns IntStream, LongStream and DoubleStream respectively. For other primitive types, Arrays. stream() won't work.


1 Answers

Arrays.stream(int[]) creates an IntStream, not a Stream<Integer>. So you need to call mapToObj instead of just map, when mapping an int to an object.

This should work as expected:

String commaSeparatedNumbers = Arrays.stream(numbers)     .mapToObj(i -> ((Integer) i).toString()) //i is an int, not an Integer     .collect(Collectors.joining(", ")); 

which you can also write:

String commaSeparatedNumbers = Arrays.stream(numbers)     .mapToObj(Integer::toString)     .collect(Collectors.joining(", ")); 
like image 158
assylias Avatar answered Oct 19 '22 11:10

assylias