一、简介
在这个简短的教程中,我们将展示如何将基元数组转换为对象数组,反之亦然。
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 上获取。