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

2022-08-31 04:07:14

我是Java的新手。如何将 a 转换为 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[]转换为Integraph[]的问题


答案 1

通过在Java 8中添加流,我们可以编写如下代码:

int[] example1 = list.stream().mapToInt(i->i).toArray();
// OR
int[] example2 = list.stream().mapToInt(Integer::intValue).toArray();

思考过程:

  • 简单返回一个数组,所以它不是我们想要的。此外,不执行我们想要的操作,因为泛型类型不能表示基元类型Stream#toArrayObject[]Stream#toArray(IntFunction<A[]> generator)Aint

  • 因此,最好有一些可以处理基元类型而不是包装器的流,因为它的方法很可能也会返回一个数组(返回其他类似甚至盒装的东西在这里是不自然的)。幸运的是,Java 8有这样一个流,那就是IntStream。intIntegertoArrayint[]Object[]Integer[]

  • 因此,现在我们唯一需要弄清楚的就是如何将我们的(将从中返回)转换为闪亮的 。Stream<Integer>list.stream()IntStream

    在文档中快速搜索,同时寻找返回的方法,将我们指向我们的解决方案,即mapToInt(ToIntFunction<?超级T>映射器)方法。我们需要做的就是提供从 到 的映射。StreamIntStreamIntegerint

    由于ToIntFunction功能接口,我们可以通过lambda方法引用提供其实例。

    无论如何,要将整数转换为int,我们可以使用Integer#intValue,这样我们就可以在里面写:mapToInt

    mapToInt( (Integer i) -> i.intValue() )
    

    (或者有些人可能更喜欢:.mapToInt(Integer::intValue)

    但是可以使用unboxing生成类似的代码,因为编译器知道此lambda的结果必须是类型的(中使用的lambda是接口的实现,该接口期望将类型方法作为主体:期望返回一个)。intmapToIntToIntFunctionint applyAsInt(T value)int

    因此,我们可以简单地编写:

    mapToInt((Integer i)->i)
    

    另外,由于编译器可以推断出键入,因为返回 a ,我们也可以跳过它,这给我们留下了Integer(Integer i)List<Integer>#stream()Stream<Integer>

    mapToInt(i -> i)
    

答案 2

不幸的是,我不相信真的有更好的方法来做到这一点,因为Java处理基元类型,装箱,数组和泛型的性质。特别:

  • List<T>.toArray不起作用,因为没有从 到 的转换Integerint
  • 您不能用作泛型的类型参数,因此它必须是特定于 -a 的方法(或使用反射来执行令人讨厌的欺骗的方法)。intint

我相信有些库为所有基元类型自动生成了这种方法的版本(即,有一个模板是为每种类型的复制的)。这很丑陋,但这就是我担心:(

尽管 Arrays 类在泛型到达 Java 之前就已经问世了,但如果今天引入它,它仍然必须包含所有可怕的重载(假设你想使用原始数组)。