一、简介

在这个简短的教程中,我们将展示如何将基元数组转换为对象数组,反之亦然。

2. 问题

假设我们有一个基元数组,例如 int[] ,并且希望将其转换为对象数组 Integer[] 。我们可以直观地尝试强制转换:

Integer[] integers = (Integer[])(new int[]{0,1,2,3,4});

但是,由于类型不可转换,这将导致编译错误。这是因为 自动装箱仅适用于单个元素 ,不适用于数组或集合

因此,我们需要对元素进行一一转换。让我们看一下执行此操作的几个选项。

3、迭代

让我们看看如何在迭代中使用自动装箱。

首先,让我们将原始数组转换为对象数组:

int[] input = new int[] { 0, 1, 2, 3, 4 };
Integer[] expected = new Integer[] { 0, 1, 2, 3, 4 };

Integer[] output = new Integer[input.length];
for (int i = 0; i < input.length; i++) {
    output[i] = input[i];
}

assertArrayEquals(expected, output);

现在,让我们将对象数组转换为基元数组:

Integer[] input = new Integer[] { 0, 1, 2, 3, 4 };
int[] expected = new int[] { 0, 1, 2, 3, 4 };

int[] output = new int[input.length];
for (int i = 0; i < input.length; i++) {
    output[i] = input[i];
}

assertArrayEquals(expected, output);

正如我们所看到的,这根本不复杂,但是更可读的解决方案(例如 Stream API)可能更适合我们的需求。

4. 流

从Java 8开始,我们可以使用Stream API来编写流畅的代码。

首先,让我们看看如何对原始数组的元素进行装箱:

int[] input = new int[] { 0, 1, 2, 3, 4 };
Integer[] expected = new Integer[] { 0, 1, 2, 3, 4 };

Integer[] output = Arrays.stream(input)
  .boxed()
  .toArray(Integer[]::new);

assertArrayEquals(expected, output);

请注意 toArray 方法中的 Integer[]::new 参数。如果没有此参数,流将返回 Object[] 而不是 Integer[]

接下来,为了将它们转换回来,我们将使用 mapToInt 方法和 Integer 的拆箱方法:

Integer[] input = new Integer[] { 0, 1, 2, 3, 4 };
int[] expected = new int[] { 0, 1, 2, 3, 4 };

int[] output = Arrays.stream(input)
  .mapToInt(Integer::intValue)
  .toArray();

assertArrayEquals(expected, output);

通过 Stream API,我们创建了一个更具可读性的解决方案,但如果我们仍然希望它更简洁,我们可以尝试一个库,例如 Apache Commons。

5.阿帕奇共享资源

首先,让我们添加Apache Commons Lang库作为依赖项:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version>
</dependency>

然后,要将基元数组转换为装箱数组,我们使用 ArrayUtils.toObject 方法:

int[] input = new int[] { 0, 1, 2, 3, 4 };
Integer[] expected = new Integer[] { 0, 1, 2, 3, 4 };

Integer[] output = ArrayUtils.toObject(input);

assertArrayEquals(expected, output);

最后,要将装箱元素转换回基元,我们使用 ArrayUtils.toPrimitives 方法:

Integer[] input = new Integer[] { 0, 1, 2, 3, 4 };
int[] expected = new int[] { 0, 1, 2, 3, 4 };

int[] output = ArrayUtils.toPrimitive(input);

assertArrayEquals(expected, output);

Apache Commons Lang 库为我们的问题提供了一个简洁、易于使用的解决方案,但代价是必须添加依赖项。

六,结论

在本文中,我们研究了几种将基元数组转换为装箱元素数组的方法,然后将装箱元素转换回其基元对应项。

与往常一样,本文的代码示例可在 GitHub 上获取。