我如何在Java中转换列表<整数>到int[] ?

我很困惑,因为List.toArray()实际上返回一个对象[],它既不能转换为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[] ?


当前回答

这个简单的循环总是正确的!没有错误

  int[] integers = new int[myList.size()];
  for (int i = 0; i < integers.length; i++) {
      integers[i] = myList.get(i);
  }

其他回答

实际上没有办法“一行行”你正在尝试做的事情,因为toArray返回一个对象[],你不能从Object[]转换为int[]或Integer[]转换为int[]。

不幸的是,由于Java处理原始类型、装箱、数组和泛型的本质,我不相信真的有更好的方法来做到这一点。特别是:

列表> < T。toArray不能工作,因为没有从Integer到int的转换 你不能使用int作为泛型的类型参数,所以它必须是一个特定于int的方法(或者使用反射来做讨厌的把戏)。

我相信有些库已经为所有的基本类型自动生成了这种方法的版本(也就是说,每个类型都复制了一个模板)。它很丑,但恐怕就是这样。

即使Arrays类出现在Java泛型出现之前,如果今天引入它(假设您想使用基本数组),它仍然必须包含所有可怕的重载。

最简单的方法是使用Apache Commons Lang。它有一个方便的ArrayUtils类,可以做任何您想做的事情。将toPrimitive方法与整数数组的重载一起使用。

List<Integer> myList;
 ... assign and fill the list
int[] intArray = ArrayUtils.toPrimitive(myList.toArray(new Integer[myList.size()]));

这样你就不用白费力气了。Commons Lang有很多Java遗漏的有用的东西。上面,我选择创建一个大小合适的Integer列表。你也可以使用一个0长度的静态Integer数组,让Java分配一个合适大小的数组:

static final Integer[] NO_INTS = new Integer[0];
   ....
int[] intArray2 = ArrayUtils.toPrimitive(myList.toArray(NO_INTS));

Java 8为我们提供了一种通过流来实现这一点的简单方法……

使用collections stream()函数,然后映射到int,你将得到一个IntStream。对于IntStream,我们可以调用toArray(),得到int []

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

int []

to IntStream

使用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);
}