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

时间:2014-04-14 10:17:14

标签: java arrays collections lambda java-8

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

我想写一个函数将一个List /数组的字符串转换为数组/整数,浮点数,双打等等。

在普通的Java中,它就像

一样简单
for(String str : strList){
   intList.add(Integer.valueOf(str));
}

但是如果将一个字符串数组转换为一个整数数组,我如何用lambda实现相同的效果。

10 个答案:

答案 0 :(得分:112)

您可以使用map上的stream操作创建帮助方法,将类型T的列表(数组)转换为U类型的列表(数组)

//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(请参阅Method references

答案 1 :(得分:109)

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

答案 2 :(得分:25)

不需要接受答案的辅助方法。 Streams可以与lambdas一起使用,或者通常使用Method References缩短。 Streams支持功能操作。 map()转换元素,collect(...)toArray()将流包装回数组或集合。

Venkat Subramaniam's talk (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 version of these examples。可以单击fork然后运行以在浏览器中运行。

答案 3 :(得分:7)

编辑: 正如评论中所指出的,这是一个更简单的版本: Arrays.stream(stringArray).mapToInt(Integer::parseInt).toArray() 这样我们就可以跳过列表中的整个转换。

我发现了另一个单线解决方案,但它仍然很慢(比周期长约100倍 - 在6000 0&#39;的数组上测试)

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)将流中的所有元素转换为Integers
  4. .mapToInt(i-&gt; i)将所有整数转换为整数(如果只需要整数,则不必执行此操作)
  5. .toArray()将Stream转换回数组

答案 4 :(得分: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);

答案 5 :(得分:2)

列表:

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

对于数组:

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

答案 6 :(得分:0)

在以前的答案中没有找到它,因此,对于Java 8和流:

String[]转换为Integer[]

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

答案 7 :(得分:-1)

另外 - 当字符串数组没有元素时控制:

Arrays.stream(from).filter(t -> (t != null)&&!("".equals(t))).map(func).toArray(generator) 

答案 8 :(得分:-1)

我使用带有lambda操作的maptoInt()将字符串转换为Integer

int[] arr = Arrays.stream(stringArray).mapToInt(item -> Integer.parseInt(item)).toArray();

答案 9 :(得分:-3)

Arrays.toString(int [])为我工作。