如何在Java中将List转换为int[]?
如何在Java中将List转换为int[]?
这个问题已经在这里有答案:如何将包含整数的ArrayList转换为原始int数组?
如何在Java中将List
转换为int[]
?
我感到困惑的是,List.toArray()
实际上返回一个Object[]
,既不能转换为Integer[]
也不能转换为int[]
。
现在我正在使用循环来完成此操作:
int[] toIntArray(List list) { int[] ret = new int[list.size()]; for(int i = 0; i < ret.length; i++) ret[i] = list.get(i); return ret; }
有更好的方法吗?
这与问题如何在Java中将int[]转换为Integer[]?类似。
不幸的是,由于Java处理基本类型、装箱、数组和泛型的特性,我并不认为有更好的方法来解决这个问题。
List
不起作用,因为没有从.toArray Integer
转换为int
的转换。- 您无法将
int
用作泛型的类型参数,因此必须是一个特定于int
的方法(或使用反射进行不良操作的方法)。
我相信有一些库会对所有原始类型(即为每种类型复制一个模板)自动生成这种方法的版本。虽然这很丑陋,但这就是现实,我很遗憾。
即使在Java引入泛型之前,Arrays
类已经出现了,但如果今天引入它(假设您要使用原始数组),它仍然必须包含所有令人讨厌的重载。
在Java 8中添加了流(Stream),我们可以编写代码:
int[] example1 = list.stream().mapToInt(i->i).toArray(); // OR int[] example2 = list.stream().mapToInt(Integer::intValue).toArray();
思考过程:
-
简单的
Stream#toArray
返回一个Object []
数组,因此不符合我们的要求。此外,Stream#toArray(IntFunction 生成器)
返回A []
不是我们想要的,因为泛型类型A
无法表示原始类型int
。 -
因此,有一种流比较好,它被设计为可以处理原始类型
int
,而不是像Integer
这样的引用类型,因为它的toArray
方法很可能也会返回一个int []
数组(返回其他类型,如Object []或装箱的Integer []
甚至是不合适的)。幸运的是,Java 8有这样的流,即IntStream
。 -
所以现在我们需要解决的唯一问题就是如何将我们的
Stream
(它将从list.stream()
返回)转换为那个闪亮IntStream
。在查找返回
IntStream
的方法时,快速搜索Stream
文档,指向了我们的解决方案,即mapToInt(ToIntFunction super T> mapper)
方法。我们只需要提供从Integer
到int
的映射即可。由于
ToIntFunction
是函数式接口,因此我们还可以通过lambda或方法引用提供其实例。无论如何,我们可以使用
Integer#intValue
将Integer转换为int,因此在mapToInt
中,我们可以编写:mapToInt( (Integer i) -> i.intValue() )
(或者有些人喜欢:
mapToInt(Integer :: intValue)
。)但是,使用取消装箱也可以生成类似的代码,因为编译器知道这个lambda的结果必须是
int
类型(在mapToInt
中使用的lambda是ToIntFunction
接口的实现,它期望体中的方法为:int applyAsInt(T value)
,该方法预计返回一个int
)。因此,我们可以简单地写:
mapToInt((Integer i)->i)
此外,由于编译器可以通过
List
返回#stream() Stream
来推断(Integer i)
中的Integer
类型,因此我们也可以跳过它,保留:mapToInt(i -> i)