我正在尝试使用以下代码将包含Integer对象的ArrayList转换为原始int [],但它会引发编译时错误.是否可以用Java进行转换?
Listx = new ArrayList (); int[] n = (int[])x.toArray(int[x.size()]);
Jon Skeet.. 208
你可以转换,但我认为没有任何内置功能可以自动完成:
public static int[] convertIntegers(Listintegers) { int[] ret = new int[integers.size()]; for (int i=0; i < ret.length; i++) { ret[i] = integers.get(i).intValue(); } return ret; }
(请注意,如果其中包含integers
任何元素或任何元素,则会抛出NullPointerException null
.)
编辑:根据评论,您可能希望使用列表迭代器来避免令人讨厌的成本,例如LinkedList
:
public static int[] convertIntegers(Listintegers) { int[] ret = new int[integers.size()]; Iterator iterator = integers.iterator(); for (int i = 0; i < ret.length; i++) { ret[i] = iterator.next().intValue(); } return ret; }
使用List的迭代器(每个迭代器)迭代可能更好,以避免访问不是O(1)的列表上的性能命中. (20认同)
现在在Java8中更容易:`integers.stream().mapToInt(Integer :: valueOf).toArray` (6认同)
Alexis C... 199
如果您使用的是java-8,还有另一种方法可以做到这一点.
int[] arr = list.stream().mapToInt(i -> i).toArray();
它的作用是:
Stream
从列表中获取
获得IntStream
由每个元素映射到其自身(恒等函数),在取消装箱int
由每个值保持Integer
对象(因为Java 5的自动完成)
int
通过调用获取数组toArray
您还可以intValue
通过方法引用显式调用,即:
int[] arr = list.stream().mapToInt(Integer::intValue).toArray();
还值得一提的是,NullPointerException
如果您null
在列表中有任何引用,则可以获得.通过向流管道添加过滤条件可以很容易地避免这种情况,如下所示:
//.filter(Objects::nonNull) also works int[] arr = list.stream().filter(i -> i != null).mapToInt(i -> i).toArray();
例:
Listlist = 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]
Snehal.. 63
谷歌番石榴
Google Guava通过调用提供了一种巧妙的方法Ints.toArray
.
Listlist = ...; int[] values = Ints.toArray(list);
我认为这将是我的答案 - 我会在任何一天使用复制粘贴功能库.尤其是一个体面的项目可能已经使用的库.我希望这个答案在未来得到更多的投票和可见度. (4认同)
Björn.. 60
Apache Commons有一个ArrayUtils类,它有一个方法toPrimitive()就是这样做的.
import org.apache.commons.lang.ArrayUtils; ... Listlist = new ArrayList (); list.add(new Integer(1)); list.add(new Integer(2)); int[] intArray = ArrayUtils.toPrimitive(list.toArray(new Integer[0]));
然而,正如乔恩所表明的那样,自己做这件事很容易,而不是使用外部库.
你可以转换,但我认为没有任何内置功能可以自动完成:
public static int[] convertIntegers(Listintegers) { int[] ret = new int[integers.size()]; for (int i=0; i < ret.length; i++) { ret[i] = integers.get(i).intValue(); } return ret; }
(请注意,如果其中包含integers
任何元素或任何元素,则会抛出NullPointerException null
.)
编辑:根据评论,您可能希望使用列表迭代器来避免令人讨厌的成本,例如LinkedList
:
public static int[] convertIntegers(Listintegers) { int[] ret = new int[integers.size()]; Iterator iterator = integers.iterator(); for (int i = 0; i < ret.length; i++) { ret[i] = iterator.next().intValue(); } return ret; }
如果您使用的是java-8,还有另一种方法可以做到这一点.
int[] arr = list.stream().mapToInt(i -> i).toArray();
它的作用是:
Stream
从列表中获取
获得IntStream
由每个元素映射到其自身(恒等函数),在取消装箱int
由每个值保持Integer
对象(因为Java 5的自动完成)
int
通过调用获取数组toArray
您还可以intValue
通过方法引用显式调用,即:
int[] arr = list.stream().mapToInt(Integer::intValue).toArray();
还值得一提的是,NullPointerException
如果您null
在列表中有任何引用,则可以获得.通过向流管道添加过滤条件可以很容易地避免这种情况,如下所示:
//.filter(Objects::nonNull) also works int[] arr = list.stream().filter(i -> i != null).mapToInt(i -> i).toArray();
例:
Listlist = 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]
Google Guava通过调用提供了一种巧妙的方法Ints.toArray
.
Listlist = ...; int[] values = Ints.toArray(list);
Apache Commons有一个ArrayUtils类,它有一个方法toPrimitive()就是这样做的.
import org.apache.commons.lang.ArrayUtils; ... Listlist = new ArrayList (); list.add(new Integer(1)); list.add(new Integer(2)); int[] intArray = ArrayUtils.toPrimitive(list.toArray(new Integer[0]));
然而,正如乔恩所表明的那样,自己做这件事很容易,而不是使用外部库.
我相信使用List的迭代器迭代是一个更好的主意,因为list.get(i)
根据List实现可能会有不佳的性能:
private int[] buildIntArray(Listintegers) { int[] ints = new int[integers.size()]; int i = 0; for (Integer n : integers) { ints[i++] = n; } return ints; }
使用Dollar应该很简单:
Listlist = $(5).toList(); // the list 0, 1, 2, 3, 4 int[] array = $($(list).toArray()).toIntArray();
我打算改进DSL以删除中间toArray()
调用