Reputation: 18848
Since Java 8 comes with powerful lambda expressions,
I would like to write a function to convert a List/array of Strings to array/List of Integers, Floats, Doubles etc..
In normal Java, it would be as simple as
for(String str : strList){
intList.add(Integer.valueOf(str));
}
But how do I achieve the same with a lambda, given an array of Strings to be converted to an array of Integers.
Upvotes: 120
Views: 224787
Reputation: 41
I used maptoInt() with Lambda operation for converting string to Integer
int[] arr = Arrays.stream(stringArray).mapToInt(item -> Integer.parseInt(item)).toArray();
Upvotes: 0
Reputation: 1388
I didn't find it in the previous answers, so, with Java 8 and streams:
Convert String[]
to Integer[]
:
Arrays.stream(stringArray).map(Integer::valueOf).toArray(Integer[]::new)
Upvotes: 0
Reputation: 11706
For List :
List<Integer> intList
= stringList.stream().map(Integer::valueOf).collect(Collectors.toList());
For Array :
int[] intArray = Arrays.stream(stringArray).mapToInt(Integer::valueOf).toArray();
Upvotes: 7
Reputation: 939
You can also use,
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
Integer[] array = list.stream()
.map( v -> Integer.valueOf(v))
.toArray(Integer[]::new);
Upvotes: 2
Reputation: 732
In addition - control when string array doesn't have elements:
Arrays.stream(from).filter(t -> (t != null)&&!("".equals(t))).map(func).toArray(generator)
Upvotes: -1
Reputation: 4176
List<Integer> intList = strList.stream()
.map(Integer::valueOf)
.collect(Collectors.toList());
Upvotes: 149
Reputation: 5724
The helper methods from the accepted answer are not needed. Streams can be used with lambdas or usually shortened using Method References. Streams enable functional operations. map()
converts the elements and collect(...)
or toArray()
wrap the stream back up into an array or collection.
Venkat Subramaniam's talk (video) explains it better than me.
1 Convert List<String>
to List<Integer>
List<String> l1 = Arrays.asList("1", "2", "3");
List<Integer> r1 = l1.stream().map(Integer::parseInt).collect(Collectors.toList());
// the longer full lambda version:
List<Integer> r1 = l1.stream().map(s -> Integer.parseInt(s)).collect(Collectors.toList());
2 Convert List<String>
to int[]
int[] r2 = l1.stream().mapToInt(Integer::parseInt).toArray();
3 Convert String[]
to List<Integer>
String[] a1 = {"4", "5", "6"};
List<Integer> r3 = Stream.of(a1).map(Integer::parseInt).collect(Collectors.toList());
4 Convert String[]
to int[]
int[] r4 = Stream.of(a1).mapToInt(Integer::parseInt).toArray();
5 Convert String[]
to List<Double>
List<Double> r5 = Stream.of(a1).map(Double::parseDouble).collect(Collectors.toList());
6 (bonus) Convert int[]
to String[]
int[] a2 = {7, 8, 9};
String[] r6 = Arrays.stream(a2).mapToObj(Integer::toString).toArray(String[]::new);
Lots more variations are possible of course.
Also see Ideone version of these examples. Can click fork and then run to run in the browser.
Upvotes: 38
Reputation: 93872
You could create helper methods that would convert a list (array) of type T
to a list (array) of type U
using the map
operation on stream
.
//for lists
public static <T, U> List<U> convertList(List<T> from, Function<T, U> func) {
return from.stream().map(func).collect(Collectors.toList());
}
//for arrays
public static <T, U> U[] convertArray(T[] from,
Function<T, U> func,
IntFunction<U[]> generator) {
return Arrays.stream(from).map(func).toArray(generator);
}
And use it like this:
//for lists
List<String> stringList = Arrays.asList("1","2","3");
List<Integer> integerList = convertList(stringList, s -> Integer.parseInt(s));
//for arrays
String[] stringArr = {"1","2","3"};
Double[] doubleArr = convertArray(stringArr, Double::parseDouble, Double[]::new);
s -> Integer.parseInt(s)
could be replaced with Integer::parseInt
(see Method references)
Upvotes: 133
Reputation: 105
EDIT:
As pointed out in the comments, this is a much simpler version:
Arrays.stream(stringArray).mapToInt(Integer::parseInt).toArray()
This way we can skip the whole conversion to and from a list.
I found another one line solution, but it's still pretty slow (takes about 100 times longer than a for cycle - tested on an array of 6000 0's)
String[] stringArray = ...
int[] out= Arrays.asList(stringArray).stream().map(Integer::parseInt).mapToInt(i->i).toArray();
What this does:
Upvotes: 7