如何将包含整数的ArrayList转换为原始的int类型数组?

439

我正在尝试使用以下代码将包含Integer对象的ArrayList转换为原始的int[],但它会抛出编译时错误。在Java中是否有可能进行转换?

List<Integer> x =  new ArrayList<Integer>();
int[] n = (int[])x.toArray(int[x.size()]);

11
不是完全相同的问题(虽然也不是很远) - Jonik
1
是的,这是一个ArrayList,“duplicate”是关于普通数组的。 - Scott McIntyre
3
如果您不需要原始整数,可以使用以下代码: List<Integer> x = new ArrayList<Integer>(); Integer[] n = x.toArray(new Integer[0]); - Evorlor
可能是将对象数组转换为其原始类型数组的重复问题。 - cellepo
2
@cellepo 这个问题是关于对象和原始数组之间的转换,而这个问题是关于ArrayList和原始数组之间的转换。 - Nosrep
20个回答

5

Java 8

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

OR 

int[] array = list.stream().mapToInt(Integer::intValue).toArray();

1
你的回答与这个重复了。请删除你的帖子,并在将来避免这样做。 - Janez Kuhar

4
我很困惑为什么我们总是鼓励使用一次性的自定义方法,而一个已经解决了问题的好用库,比如Apache Commons,完全可以胜任。虽然解决方案可能微不足道甚至荒谬可笑,但由于长期维护和可访问性的原因,鼓励这种行为是不负责任的。
只需使用Apache Commons即可:Apache Commons

9
我同意之前评论者的观点。你不仅涉及了Apache Commons,而且它很容易转化成一大堆需要被引入的传递依赖项。最近,我只需替换一行代码就能移除大量依赖项 :-( 依赖项是代价高昂的,编写基础代码是不错的实践。 - Peter Kriens
1
同意@PeterKriens。如果有什么问题,那么问题就在于Java不支持其标准数据类型中的简单转换。 - Adam Hughes

3
如果你正在使用 Eclipse Collections,你可以使用collectInt()方法,将对象容器转换为基本的int类型容器。
List<Integer> integers = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
MutableIntList intList =
  ListAdapter.adapt(integers).collectInt(i -> i);
Assert.assertArrayEquals(new int[]{1, 2, 3, 4, 5}, intList.toArray());

如果你可以将你的ArrayList转换成FastList,那么你就可以摆脱适配器。

Assert.assertArrayEquals(
  new int[]{1, 2, 3, 4, 5},
  Lists.mutable.with(1, 2, 3, 4, 5)
    .collectInt(i -> i).toArray());

注意:我是Eclipse collections的提交者。


2

您可以将其简单地复制到数组中:

int[] arr = new int[list.size()];
for(int i = 0; i < list.size(); i++) {
    arr[i] = list.get(i);
}

不需要太花哨,但是它能正常运行...

1

下面您可以找到从int[] -> List -> int[]的转换

   private static int[] convert(int[] arr) {
        List<Integer> myList=new ArrayList<Integer>();
        for(int number:arr){
               myList.add(number);
            }
        }
        int[] myArray=new int[myList.size()];
        for(int i=0;i<myList.size();i++){
           myArray[i]=myList.get(i);
        }
        return myArray;
    }

0

这段代码对我有效,你可以试试:

Integer[] arr = x.toArray(new Integer[x.size()]);

值得一提的是,ArrayList 应该像这样声明:
ArrayList<Integer> list = new ArrayList<>();

12
你好,这只是一个温馨提示,OP想要的是原始数组,而不是对象数组。 - OLIVER.KOO
4
原文意思:要使用原始的int类型而不是包装类Integer! 翻译:Use primitive int type instead of wrapper class Integer! - Bartzilla

0
如果时间对你的任务很关键,请不要使用Java流。 它比使用for-each循环慢。请使用相同的方法:
    List<Integer> modes = new ArrayList<>();
    int[] m = new int[modes.size()];
    for (int i = 0; i < m.length; i++) {
        m[i] = modes.get(i);
    }

你可以用jmh来测量它。

-1
一个非常简单的一行解决方案是:
Integer[] i = arrlist.stream().toArray(Integer[]::new);

3
OP说的“primitive array”指的是int[],而不是Integer[]包装对象。哈哈 - luckyguy73

-4
   List<Integer> list = new ArrayList<Integer>();

    list.add(1);
    list.add(2);

    int[] result = null;
    StringBuffer strBuffer = new StringBuffer();
    for (Object o : list) {
        strBuffer.append(o);
        result = new int[] { Integer.parseInt(strBuffer.toString()) };
        for (Integer i : result) {
            System.out.println(i);
        }
        strBuffer.delete(0, strBuffer.length());
    }

1
这个答案不起作用,它返回一个只有一个元素的数组,而不是多个元素。 - Mysticial
为什么要使用StringBuffer?为什么要将Integer转换为String,然后再转换为Integer,然后再转换为int,最后再转换为Integer?为什么要使用只有一个元素的数组,并在其中循环,当它只包含一个元素时?为什么要在外部循环中将Integers强制转换为Objects?这里有太多问题了。@CodeMadness只是一个喷子账号吗? - Victor Zamanian

-7
Integer[] arr = (Integer[]) x.toArray(new Integer[x.size()]);

像正常的 int[] 一样访问 arr


7
这并没有回答问题,问题是关于将数据转换为原始类型(int)。 - Asaf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接