Lambdaexpression式将数组/string列表转换为数组/列表整数

由于Java 8带有强大的lambdaexpression式,

我想写一个函数来转换一个列表/数组的string数组/列表整数,浮动,双打等。

在普通的Java中,它将如此简单

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

但是,如何给lambda赋予一个string数组,将其转换为一个整数数组,如何实现同样的效果。

您可以创build帮助器方法,使用stream上的map操作将Ttypes的列表(数组)转换为Utypes的列表(数组)。

 //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::parseIntreplace(请参阅方法引用 )

 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(); 

这是什么:

  1. Arrays.asList()将数组转换为List
  2. .stream将其转换为Stream(需要执行映射)
  3. .map(Integer :: parseInt)将stream中的所有元素转换为整数
  4. .mapToInt(i-> i)将所有整数转换为整数(如果只需要整数,则不必这样做)
  5. .toArray()将Stream转换回数组

另外 – 控制string数组中没有元素时:Arrays.stream(from).filter(t – >(t!= null)&&!(“”。equals(t)))。map(func).toArray (发电机)