由于Java 8附带了强大的lambda表达式,
我想写一个函数来将字符串的列表/数组转换为整数、浮点数、双精度数等的数组/列表。
在普通的Java中,它就像这样简单
for(String str : strList){
intList.add(Integer.valueOf(str));
}
但是,如何使用lambda实现相同的功能,给定要转换为整数数组的字符串数组。
发布于 2014-04-14 18:26:19
您可以创建帮助器方法,使用map
操作将T
类型的列表(数组)转换为U
类型的列表(数组)。
//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);
}
并像这样使用它:
//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)
可以替换为Integer::parseInt
(请参阅Method references)
发布于 2014-08-31 02:05:18
List<Integer> intList = strList.stream()
.map(Integer::valueOf)
.collect(Collectors.toList());
发布于 2016-08-20 15:35:28
不需要接受答案中的辅助方法。Streams可以与lambda一起使用,或者通常使用Method References来缩写。Streams支持功能操作。map()
转换元素,然后collect(...)
或toArray()
将流包装回一个数组或集合。
Venkat Subramaniam's talk (video)比我解释得更好。
1将List<String>
转换为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将List<String>
转换为int[]
int[] r2 = l1.stream().mapToInt(Integer::parseInt).toArray();
3将String[]
转换为List<Integer>
String[] a1 = {"4", "5", "6"};
List<Integer> r3 = Stream.of(a1).map(Integer::parseInt).collect(Collectors.toList());
4将String[]
转换为int[]
int[] r4 = Stream.of(a1).mapToInt(Integer::parseInt).toArray();
5将String[]
转换为List<Double>
List<Double> r5 = Stream.of(a1).map(Double::parseDouble).collect(Collectors.toList());
6(奖励)将int[]
转换为String[]
int[] a2 = {7, 8, 9};
String[] r6 = Arrays.stream(a2).mapToObj(Integer::toString).toArray(String[]::new);
当然,更多的变化是可能的。
另请参阅Ideone version of these examples。可以单击fork,然后单击run在浏览器中运行。
https://stackoverflow.com/questions/23057549
复制相似问题