Lambdaexpression式将数组/string列表转换为数组/列表整数
由于Java 8带有强大的lambdaexpression式,
我想写一个函数来转换一个列表/数组的string数组/列表整数,浮动,双打等。
在普通的Java中,它将如此简单
for(String str : strList){ intList.add(Integer.valueOf(str)); }
但是,如何给lambda赋予一个string数组,将其转换为一个整数数组,如何实现同样的效果。
您可以创build帮助器方法,使用stream
上的map
操作将T
types的列表(数组)转换为U
types的列表(数组)。
//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
replace(请参阅方法引用 )
List<Integer> intList = strList.stream() .map(Integer::valueOf) .collect(Collectors.toList());
从接受的答案的帮手方法是不需要的。 stream可以和lambda一起使用,或者通常使用方法引用缩短。 stream可以启用function操作。 map()
转换元素并collect(...)
或toArray()
将stream包装回数组或集合。
Venkat Subramaniam的讲话(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版本 。 可以点击fork然后运行在浏览器中运行。
编辑:正如在注释中指出的,这是一个更简单的版本: Arrays.stream(stringArray).mapToInt(Integer::parseInt).toArray()
这样我们可以跳过整个转换和从列表中。
我发现了另外一种线路解决scheme,但它仍然非常慢(比一个循环周期长约100倍 – 在一个6000的数组上testing)
String[] stringArray = ... int[] out= Arrays.asList(stringArray).stream().map(Integer::parseInt).mapToInt(i->i).toArray();
这是什么:
- Arrays.asList()将数组转换为List
- .stream将其转换为Stream(需要执行映射)
- .map(Integer :: parseInt)将stream中的所有元素转换为整数
- .mapToInt(i-> i)将所有整数转换为整数(如果只需要整数,则不必这样做)
- .toArray()将Stream转换回数组
另外 – 控制string数组中没有元素时:Arrays.stream(from).filter(t – >(t!= null)&&!(“”。equals(t)))。map(func).toArray (发电机)