How to convert an ArrayList containing Integers to primitive int array?

I'm trying to convert an ArrayList containing Integer objects to primitive int[] with the following piece of code, but it is throwing compile time error. Is it possible to convert in Java?

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

You can convert, but I don't think there's anything built in to do it automatically:

public static int[] convertIntegers(List<Integer> integers)
{
    int[] ret = new int[integers.size()];
    for (int i=0; i < ret.length; i++)
    {
        ret[i] = integers.get(i).intValue();
    }
    return ret;
}

(Note that this will throw a NullPointerException if either integers or any element within it is null .)

EDIT: As per comments, you may want to use the list iterator to avoid nasty costs with lists such as LinkedList :

public static int[] convertIntegers(List<Integer> integers)
{
    int[] ret = new int[integers.size()];
    Iterator<Integer> iterator = integers.iterator();
    for (int i = 0; i < ret.length; i++)
    {
        ret[i] = iterator.next().intValue();
    }
    return ret;
}

If you are using java-8 there's also another way to do this.

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

What it does is:

  • getting a Stream<Integer> from the list
  • obtaining an IntStream by mapping each element to itself (identity function), unboxing the int value hold by each Integer object (done automatically since Java 5)
  • getting the array of int by calling toArray
  • You could also explicitly call intValue via a method reference, ie:

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

    It's also worth mentioning that you could get a NullPointerException if you have any null reference in the list. This could be easily avoided by adding a filtering condition to the stream pipeline like this:

                           //.filter(Objects::nonNull) also works
    int[] arr = list.stream().filter(i -> i != null).mapToInt(i -> i).toArray();
    

    Example:

    List<Integer> list = 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]
    

    Apache Commons has a ArrayUtils class, which has a method toPrimitive() that does exactly this.

    import org.apache.commons.lang.ArrayUtils;
    ...
        List<Integer> list = new ArrayList<Integer>();
        list.add(new Integer(1));
        list.add(new Integer(2));
        int[] intArray = ArrayUtils.toPrimitive(list.toArray(new Integer[0]));
    

    However, as Jon showed, it is pretty easy to do this by yourself instead of using external libraries.

    链接地址: http://www.djcxy.com/p/46086.html

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

    下一篇: 如何将包含整数的ArrayList转换为原始int数组?