一尘不染

如何在Java中将List <Integer>转换为int []?

java

我是Java新手。我怎么能转换List<Integer>int[]Java中?我很困惑,因为List.toArray()实际上返回了一个Object[],可以将其强制转换为nether 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;
}

我敢肯定有更好的方法可以做到这一点。


阅读 963

收藏
2020-02-28

共2个答案

一尘不染

不幸的是,我不相信有真的是这样做由于Java的处理基本类型,拳击,数组和仿制药的性质的更好的方法。尤其是:

  • List<T>.toArray无法运作,因为没有从转换Integerint
  • 你不能将其int用作泛型的类型参数,因此它必须是int特定于-的方法(或使用反射进行令人讨厌的欺骗的方法)。
    我相信有些库具有针对所有原始类型的这种方法的自动生成版本(即,有为每种类型复制的模板)。这很丑,但是恐怕就是这样

即使Arrays该类在泛型到达Java之前就出现了,但如果今天引入了它,那么它仍然必须包括所有可怕的重载(假设你要使用基本数组)。

2020-02-28
一尘不染

到目前为止,还没有人提到Java 8中添加了流。

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

思考过程:

简单的Stream#toArray收益Object[],所以这不是我们想要的。也Stream#toArray(IntFunction<A[]> generator)不能满足我们的要求,因为泛型A不能表示原始类型int
所以最好有一些可以处理原始类型int而不是包装器的流Integer,因为它的toArray方法很可能还会返回int[]数组(在这里返回其他类似的东西Object[]甚至装箱Integer[]都是不自然的)。幸运的是Java 8拥有这样的流IntStream
所以现在我们唯一需要弄清楚的是如何将我们的Stream<Integer>(将返回的list.stream())转换为闪亮的IntStream。这里的Stream#mapToInt(ToIntFunction<? super T> mapper)方法可以解决。我们需要做的就是将其映射Integerint。我们可以使用类似以下Integer#getValue内容的返回值int

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

(或者如果有人喜欢mapToInt(Integer::intValue)

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

所以我们可以简单地写

mapToInt((Integer i)->i)

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

mapToInt(i -> i)
2020-02-28