如何在Java中将List<Integer>转换为int[]?

767

如何在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;
}

有没有更好的方法来做这件事?

这类似于问题 如何在Java中将int[]转换为Integer[]?


11
你只能使用以下代码将列表转换为整数数组:Integer[] arr = (Integer[])list.toArray(new Integer[list.size]); - Hardcoded
1
@Hardcoded,你可能想要编辑你的评论,使用list.size()方法并且去掉不必要的转换。 - sactiw
2
现在在Java 8中有更好的方法吗? - Makoto
2
(@Makoto:请查看[Pshemo的答案](https://dev59.com/cXNA5IYBdhLWcg3wcNbF#23945015)) - greybeard
7
int[] arr = listOfIntegers.stream().mapToInt(x->x).toArray(); - old_soul_on_the_run
显示剩余3条评论
16个回答

5

你想做的事情真的无法“单行”完成,因为toArray返回一个Object[],你不能从Object[]强制转换为int[]或Integer[]强制转换为int[]。


5
由于数组协变性,您可以在Object[]和Integer[]之间进行类型转换,但是您无法在int[]和Integer[]之间进行类型转换。 - Jon Skeet
谢谢你纠正我,我会编辑我的回答以反映你所说的内容。 - neesh

4
int[] ret = new int[list.size()];       
Iterator<Integer> iter = list.iterator();
for (int i=0; iter.hasNext(); i++) {       
    ret[i] = iter.next();                
}                                        
return ret;                              

需要解释一下。这个想法/要点是什么? - Peter Mortensen

3

另外也可以尝试使用Dollar查看此版本):

import static com.humaorie.dollar.Dollar.*
...

List<Integer> source = ...;
int[] ints = $(source).convert().toIntArray();

抱歉,我无法提供链接。以下是您要求的翻译文本:对不起,我无法提供链接。 - Pang

2
使用Eclipse Collections,如果您有一个类型为java.util.List<Integer>的列表,则可以执行以下操作:
List<Integer> integers = Lists.mutable.with(1, 2, 3, 4, 5);
int[] ints = LazyIterate.adapt(integers).collectInt(i -> i).toArray();

Assert.assertArrayEquals(new int[]{1, 2, 3, 4, 5}, ints);

如果您已经有了 Eclipse Collections 类型,例如 MutableList,则可以执行以下操作:
MutableList<Integer> integers = Lists.mutable.with(1, 2, 3, 4, 5);
int[] ints = integers.asLazy().collectInt(i -> i).toArray();

Assert.assertArrayEquals(new int[]{1, 2, 3, 4, 5}, ints);

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

2
我建议您使用Java集合API中的List<?>骨架实现。在这种特定情况下,它似乎非常有帮助:
package mypackage;

import java.util.AbstractList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class Test {

    // Helper method to convert int arrays into Lists
    static List<Integer> intArrayAsList(final int[] a) {
        if(a == null)
            throw new NullPointerException();
        return new AbstractList<Integer>() {

            @Override
            public Integer get(int i) {
                return a[i]; // Autoboxing
            }
            @Override
            public Integer set(int i, Integer val) {
                final int old = a[i];
                a[i] = val; // Auto-unboxing
                return old; // Autoboxing
            }
            @Override
            public int size() {
                return a.length;
            }
        };
    }

    public static void main(final String[] args) {
        int[] a = {1, 2, 3, 4, 5};
        Collections.reverse(intArrayAsList(a));
        System.out.println(Arrays.toString(a));
    }
}

注意自动装箱/拆箱的缺点。


1
这并没有回答楼主的问题 - 楼主问如何将List转换为数组。 - John Velonis

0

使用Lambda表达式可以实现这个功能(在JDK Lambda中编译):

public static void main(String ars[]) {
    TransformService transformService = (inputs) -> {
        int[] ints = new int[inputs.size()];
        int i = 0;
        for (Integer element : inputs) {
            ints[ i++ ] = element;
        }
        return ints;
    };

    List<Integer> inputs = new ArrayList<Integer>(5) { {add(10); add(10);} };

    int[] results = transformService.transform(inputs);
}

public interface TransformService {
    int[] transform(List<Integer> inputs);
}

2
当问题被提出时,你可能无法这样做,但现在这是处理情况的好方法(假设你已经升级了Java)。你所做的可以进一步修改,以提供一种通用的方法来使用相同的方法转换许多事物。+1 - Loduwijk
7
这里的解决方案只在循环代码中。其余部分(函数接口、lambda表达式、主方法、带有虚拟数据的列表)都是多余的,对回答问题没有帮助。 - AndrewF

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