Red*_*ddy 107 java arrays collections lambda java-8
由于Java 8带有强大的lambda表达式,
我想写一个函数将一个List /数组的字符串转换为数组/整数列表,浮点数,双精度等.
在普通的Java中,它会如此简单
for(String str : strList){
intList.add(Integer.valueOf(str));
}
Run Code Online (Sandbox Code Playgroud)
但是如果将一个字符串数组转换为整数数组,我如何用lambda实现相同的效果.
Zeh*_*n12 124
List<Integer> intList = strList.stream()
.map(Integer::valueOf)
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
Ale*_* C. 122
您可以创建的helper方法,将类型的列表(阵列)转换T为类型列表(阵列)U使用map的操作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);
}
Run Code Online (Sandbox Code Playgroud)
并像这样使用它:
//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);
Run Code Online (Sandbox Code Playgroud)
s -> Integer.parseInt(s)可以替换为Integer::parseInt(参见方法参考)
Sta*_*iel 28
不需要接受答案的辅助方法.Streams可以与lambdas一起使用,或者通常使用Method References缩短.Streams支持功能操作.map()转换元素和/ collect(...)或toArray()将流包装回数组或集合.
Venkat Subramaniam的演讲(视频)比我更好地解释了它.
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());
Run Code Online (Sandbox Code Playgroud)
2转换List<String>为int[]
int[] r2 = l1.stream().mapToInt(Integer::parseInt).toArray();
Run Code Online (Sandbox Code Playgroud)
3转换String[]为List<Integer>
String[] a1 = {"4", "5", "6"};
List<Integer> r3 = Stream.of(a1).map(Integer::parseInt).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
4转换String[]为int[]
int[] r4 = Stream.of(a1).mapToInt(Integer::parseInt).toArray();
Run Code Online (Sandbox Code Playgroud)
5转换String[]为List<Double>
List<Double> r5 = Stream.of(a1).map(Double::parseDouble).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
6(奖金)转换int[]为String[]
int[] a2 = {7, 8, 9};
String[] r6 = Arrays.stream(a2).mapToObj(Integer::toString).toArray(String[]::new);
Run Code Online (Sandbox Code Playgroud)
当然可能有更多的变化.
另请参见Ideone版本的这些示例.可以单击fork然后运行以在浏览器中运行.
编辑:正如评论中所指出的,这是一个更简单的版本:
Arrays.stream(stringArray).mapToInt(Integer::parseInt).toArray()
这样我们就可以跳过列表中的整个转换.
我找到了另一个单线解决方案,但它仍然很慢(比一个周期长约100倍 - 在6000 0的阵列上测试)
String[] stringArray = ...
int[] out= Arrays.asList(stringArray).stream().map(Integer::parseInt).mapToInt(i->i).toArray();
Run Code Online (Sandbox Code Playgroud)
这是做什么的:
对于列表:
List<Integer> intList
= stringList.stream().map(Integer::valueOf).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
对于数组:
int[] intArray = Arrays.stream(stringArray).mapToInt(Integer::valueOf).toArray();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
161828 次 |
| 最近记录: |