由于Java 8具有强大的lambda表达式,
我想编写一个将字符串列表/数组转换为整数、浮点数、双精度等类型的数组/列表的函数。
在普通Java中,它会非常简单:
for(String str : strList){
intList.add(Integer.valueOf(str));
}
但是,如果我有一个字符串数组需要转换为整数数组,我该如何使用lambda实现相同的功能?
由于Java 8具有强大的lambda表达式,
我想编写一个将字符串列表/数组转换为整数、浮点数、双精度等类型的数组/列表的函数。
在普通Java中,它会非常简单:
for(String str : strList){
intList.add(Integer.valueOf(str));
}
但是,如果我有一个字符串数组需要转换为整数数组,我该如何使用lambda实现相同的功能?
List<Integer> intList = strList.stream()
.map(Integer::valueOf)
.collect(Collectors.toList());
stream
上的map
操作将类型为T
的列表(数组)转换为类型为U
的列表(数组)。请保留HTML标签。//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
(参见方法引用)。Lists.transform()
。 - Alexandros接受答案中的辅助方法不是必需的。流 可以与 lambda 一起使用,或者通常可以缩短使用 方法引用。流使函数操作成为可能。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());
将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);
编辑:
如评论中所指出的,这是一个更简单的版本:
Arrays.stream(stringArray).mapToInt(Integer::parseInt).toArray()
这样我们就可以跳过整个转换到和从列表的过程。
我发现另外一种一行解决方案,但它仍然相当慢(在一个由 6000 个 0 组成的数组上测试,需要比使用 for 循环慢 100 倍左右)
String[] stringArray = ...
int[] out= Arrays.asList(stringArray).stream().map(Integer::parseInt).mapToInt(i->i).toArray();
这段代码的作用:
Arrays.stream(stringArray).mapToInt(Integer::parseInt).toArray()
。 - xehpuk对于列表:
List<Integer> intList
= stringList.stream().map(Integer::valueOf).collect(Collectors.toList());
对于数组:
int[] intArray = Arrays.stream(stringArray).mapToInt(Integer::valueOf).toArray();
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);
在之前的回答中我没有找到相关信息,使用Java 8和流:
将String[]
转换为Integer[]
:
Arrays.stream(stringArray).map(Integer::valueOf).toArray(Integer[]::new)
int[] arr = Arrays.stream(stringArray).mapToInt(item -> Integer.parseInt(item)).toArray();
Arrays.stream(from).filter(t -> (t != null)&&!("".equals(t))).map(func).toArray(generator)
Arrays.toString(int []) 对我很有用。