如何将List<Integer>转为int[]数组,来自java8中的新方法!

前言

如何在Java中将List 转换为int []? 我很困惑,因为List.toArray()实际上返回了Object [],可以将其转换为Integer []int []

开始的时候,我使用循环来执行此操作:

int[] toIntArray(List<Integer> list){
  int[] ret = new int[list.size()];
  for(int i = 0;i < ret.length;i++)
    ret[i] = list.get(i);
  return ret;
}

但是肯定有一个更好的办法解决这个问题。

解决方案

在Java8中,提出了一个新的解决方法。

int[] array = list.stream().mapToInt(i->i).toArray();

过程解析:

  • 简单的把Stream#toArray返回Object[],所以这不是我们想要的。并且Stream#toArray(IntFunction generator)不能满足我们的要求,因为泛型A不能表示原始类型int

  • 因此,最好有一些可以处理原始类型int而不是包装器的流Integer,因为它的toArray方法很可能还会返回int[]数组(在这里返回其他类似的东西Object[]甚至装箱Integer[]都是不自然的)。幸运的是Java 8有这样的流IntStream

  • 所以现在我们唯一需要弄清楚的是如何将我们的Stream(将返回的list.stream())转换为的IntStream。这里的Stream#mapToInt(ToIntFunction mapper)方法可以解决。我们需要做的就是将其映射Integerint。我们可以使用类似以下Integer#getValue内容的返回值int

    mapToInt( (Integer i) -> i.intValue() )  
    

    (如果有人喜欢使用mapToInt(Integer::intValue)也可以)

    但是可以使用拆箱来生成类似的代码,因为编译器知道此lambda的结果必须是int(lambda在接口的mapToInt实现中,该ToIntFunction接口的主体期望int applyAsInt(T value)方法返回int)。

    所以我们可以简单地写

    mapToInt((Integer i)->i)
    

    另外,由于可以通过编译器推断出Integertype in (Integer i),因为List#stream()返回Stream也可以跳过它,这使我们可以直接写

    mapToInt(i -> i)
    

举个例子

List<Integer> list = Arrays.asList(1, 2, 3, 4);
int[] arr = list.stream().mapToInt(i -> i).toArray(); //[1, 2, 3, 4]

list.set(1, null); //[1, null, 3, 4]
arr = list.stream().filter(i -> i != null).mapToInt(i -> i).toArray(); //[1, 3, 4]

你可能感兴趣的:(Java,java,编程语言)