Lambda表达式将数组/字符串列表转换为数组/整数列表


111

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

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

在普通的Java中,它就像

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

但是在给定要转换为整数数组的字符串数组的情况下,如何使用lambda实现相同的功能。

Answers:


128

您可以创建辅助方法,该方法使用上的操作T将类型的列表(数组)转换为类型的列表(数组)。Umapstream

//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
如果您使用的是番石榴,也可以使用Lists.transform()
亚历山德罗斯

很好的例子。该功能使代码更加通用和强大。哎呀!
MarceloRebouças19年

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

5
你能解释一下吗?
Unheilig 2014年

1
这是将String列表转换为流,然后将列表中的每个元素映射/转换为Integer,然后收集到列表中。
hemanto

5
这应该是公认的答案,因为lambda的要点(原始问题要求lambda表达式)是避免定义新函数。最重要的是,此答​​案优雅地使用了现有的Integer :: valueOf函数
Jonathan Benn

31

不需要接受的答案中的帮助方法。可以与lambda一起使用,或者通常使用Method References缩短。流启用功能操作。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());

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,然后运行以在浏览器中运行。


7

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


我找到了另一种单行解决方案,但是它仍然很慢(花费比a周期长大约100倍-在6000 0的数组上测试)

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-> i)将所有Integer转换为ints(如果只需要Integer,则不必这样做)
  5. .toArray()将Stream转换回数组

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

3

对于列表:

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)

-1

另外-控制何时字符串数组不包含元素:

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

-1

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.