这类似于这个问题:How to convert int[] to Integer[] in Java?
我是Java新手。如何在Java中将List<Integer>转换为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;
}我相信有更好的方法可以做到这一点。
发布于 2009-06-06 20:28:19
不幸的是,由于Java处理原始类型、装箱、数组和泛型的本质,我不认为有更好的方法来实现这一点。特别是:
List<T>.toArray不能工作,因为没有从intInteger的转换不能使用int作为泛型的类型参数,所以它必须是int-specific方法(或者使用反射来做讨厌的把戏的方法)。我相信有一些库为所有的原始类型自动生成了这种方法的版本(也就是说,每个类型都有一个复制的模板)。很难看,但恐怕就是这么回事:
即使Arrays类在泛型出现之前就出现了,但如果今天引入它,它仍然必须包括所有可怕的重载(假设您想要使用原始数组)。
发布于 2014-05-30 08:05:17
还没有人提到Java 8中添加的streams,所以它是这样的:
int[] array = list.stream().mapToInt(i->i).toArray();
// OR
// int[] array = list.stream().mapToInt(Integer::intValue).toArray();思考过程:
Stream#toArray返回一个Object[]数组,所以它不是我们想要的。而且,因为泛型类型int不能表示基本类型Stream#toArray(IntFunction<A[]> generator),所以A不能做我们想要的事情
int而不是包装器Integer会很好,因为它的toArray方法很可能也会返回一个int[]数组(在这里返回其他东西,如Object[]或甚至装箱的Integer[]将是不自然的)。幸运的是,Java8有这样一个流,就是IntStream,
Stream<Integer> (将从list.stream()返回)转换成那个闪亮的IntStream。这里,Stream#mapToInt(ToIntFunction mapper)方法应运而生。我们所需要做的就是向它传递一个从Integer到int的映射。我们可以使用类似Integer#intValue的代码,它返回一个int,如下所示:
mapToInt( (Integer i) -> i.intValue() )(或者一些人可能更喜欢:mapToInt(Integer::intValue)。)
但是可以使用拆箱生成类似的代码,因为编译器知道这个lambda的结果必须是int类型的( mapToInt中使用的lambda是ToIntFunction接口的一个实现,该接口期望一个类型为:int applyAsInt(T value)的方法作为主体,该方法期望返回一个int)。
所以我们可以简单地写:
mapToInt((整数i)->i)
此外,由于(Integer i)中的Integer类型可以由编译器推断,因为List<Integer>#stream()返回一个Stream<Integer>,所以我们也可以跳过它,这样我们就可以
mapToInt(i -> i)
发布于 2010-07-05 05:32:35
除了Commons Lang之外,您还可以使用Guava的方法Ints.toArray(Collection collection)来实现这一点
List<Integer> list = ...
int[] ints = Ints.toArray(list);这使您不必执行Commons Lang等效项要求您自己进行的中间数组转换。
https://stackoverflow.com/questions/960431
复制相似问题