我是Java新手。我怎么能转换List<Integer>到int[]Java中?我很困惑,因为List.toArray()实际上返回了一个Object[],可以将其强制转换为nether Integer[]或int[]。
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; }
我敢肯定有更好的方法可以做到这一点。
不幸的是,我不相信有真的是这样做由于Java的处理基本类型,拳击,数组和仿制药的性质的更好的方法。尤其是:
List<T>.toArray
Integer
int
即使Arrays该类在泛型到达Java之前就出现了,但如果今天引入了它,那么它仍然必须包括所有可怕的重载(假设你要使用基本数组)。
Arrays
到目前为止,还没有人提到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)方法可以解决。我们需要做的就是将其映射Integer到int。我们可以使用类似以下Integer#getValue内容的返回值int:
Stream#toArray
Object[]
Stream#toArray(IntFunction<A[]> generator)
Integer[]
Stream<Integer>
list.stream()
IntStream
Stream#mapToInt(ToIntFunction<? super T> mapper)
mapToInt( (Integer i) -> i.intValue() )
(或者如果有人喜欢mapToInt(Integer::intValue))
mapToInt(Integer::intValue)
但是可以使用拆箱来生成类似的代码,因为编译器知道此lambda的结果必须是int(lambda在接口的mapToInt实现中,该ToIntFunction接口的主体期望int applyAsInt(T value)方法返回int)。
lambda
mapToInt
ToIntFunction
int applyAsInt(T value)
所以我们可以简单地写
mapToInt((Integer i)->i)
另外,由于可以通过编译器推断出Integertype in (Integer i),因为List<Integer>#stream()返回Stream<Integer>也可以跳过它,这使我们
Integertype in (Integer i)
List<Integer>#stream()
mapToInt(i -> i)