Lambda表达式将String类型的数组/列表转换为整数类型的数组/列表

118

由于Java 8具有强大的lambda表达式,

我想编写一个将字符串列表/数组转换为整数、浮点数、双精度等类型的数组/列表的函数。

在普通Java中,它会非常简单:

for(String str : strList){
   intList.add(Integer.valueOf(str));
}

但是,如果我有一个字符串数组需要转换为整数数组,我该如何使用lambda实现相同的功能?

10个回答

147
List<Integer> intList = strList.stream()
                               .map(Integer::valueOf)
                               .collect(Collectors.toList());

5
你能稍微解释一下吗? - Unheilig
1
这是将一个字符串列表转换为流,然后将列表的每个元素映射/转换为整数,最后收集到一个列表中。 - hemanto
5
这应该是被接受的答案,因为Lambda的重点(原始问题要求Lambda表达式)是避免定义新函数。此外,这个答案巧妙地使用了现有的Integer::valueOf函数。 - Jonathan Benn

133
你可以创建帮助方法,使用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(参见方法引用)。

5
如果你正在使用Guava,你也可以使用Lists.transform() - Alexandros
非常好的例子。该函数使代码更加灵活和强大。谢谢! - Marcelo Rebouças

38

接受答案中的辅助方法不是必需的。 可以与 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);

当然,还有很多其他的变化方式。
此外,还可以查看这些示例的Ideone版本。可以点击fork,然后运行在浏览器中。

7

编辑: 如评论中所指出的,这是一个更简单的版本: 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();

这段代码的作用:

  1. Arrays.asList() 将数组转换为List
  2. .stream 将其转换为Stream(需要执行map操作)
  3. .map(Integer::parseInt) 将流中的所有元素转换为整数类型
  4. .mapToInt(i->i) 将所有整数类型转换为int类型(如果只想要整数类型,则不必进行此操作)
  5. .toArray() 将Stream转换回数组

13
不需要步骤1和4:Arrays.stream(stringArray).mapToInt(Integer::parseInt).toArray() - xehpuk

6

对于列表:

List<Integer> intList 
 = stringList.stream().map(Integer::valueOf).collect(Collectors.toList());

对于数组:

int[] intArray = Arrays.stream(stringArray).mapToInt(Integer::valueOf).toArray();

2
您可以使用:
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);

0

在之前的回答中我没有找到相关信息,使用Java 8和流:

String[]转换为Integer[]:

Arrays.stream(stringArray).map(Integer::valueOf).toArray(Integer[]::new)

0
我使用了Lambda操作中的maptoInt()函数将字符串转换为整数。
int[] arr = Arrays.stream(stringArray).mapToInt(item -> Integer.parseInt(item)).toArray();

-1
此外 - 控制当字符串数组没有元素时:
Arrays.stream(from).filter(t -> (t != null)&&!("".equals(t))).map(func).toArray(generator) 

-3

Arrays.toString(int []) 对我很有用。


我没有回答这个问题:“如何使用lambda实现这个功能”。 - Sergei Sirik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接