在 Java 中将基元数组转换为容器数组

新手上路,请多包涵

有没有一种优雅的方法可以将基元数组转换为相应容器对象的数组——例如,将 byte[] 转换为 Byte[] ?还是我坚持循环并手动执行?

是的, for 循环并不十分困难。只是有点丑。

原文由 BlairHippo 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 695
2 个回答

阿帕奇公地

Apache Commons / Lang 有一个类 ArrayUtils 定义了这些方法。

  • 所有调用的方法 toObject(...) 从原始数组转换为包装器数组
  • 所有调用 toPrimitive(...) 从包装器对象数组转换为原始数组

例子:

 final int[]     original        = new int[] { 1, 2, 3 };
final Integer[] wrappers        = ArrayUtils.toObject(original);
final int[]     primitivesAgain = ArrayUtils.toPrimitive(wrappers);
assert Arrays.equals(original, primitivesAgain);


番石榴

但是后来我会说包装基元数组不是很有用,所以你可能想看看 Guava ,它提供了所有数字类型的列表,由基元数组支持:

 List<Integer> intList = Ints.asList(1,2,3,4,5);
List<Long> longList   = Longs.asList(1L,2L,3L,4L,5L);
// etc.

这些数组支持的集合的好处是

  1. 它们是实时视图(即更新数组会更改列表,反之亦然)
  2. 包装器对象仅在需要时创建(例如,在迭代列表时)

参见: 番石榴解释/原语


Java 8

另一方面,使用 Java 8 lambdas / streams,您可以在不使用外部库的情况下使这些转换变得非常简单:

 int[] primitiveInts = {1, 2, 3};
Integer[] wrappedInts = Arrays.stream(primitiveInts)
                              .boxed()
                              .toArray(Integer[]::new);
int[] unwrappedInts = Arrays.stream(wrappedInts)
                             .mapToInt(Integer::intValue)
                             .toArray();
assertArrayEquals(primitiveInts, unwrappedInts);

double[] primitiveDoubles = {1.1d, 2.2d, 3.3d};
Double[] wrappedDoubles = Arrays.stream(primitiveDoubles)
                                .boxed()
                                .toArray(Double[]::new);
double[] unwrappedDoubles = Arrays.stream(wrappedDoubles)
                                  .mapToDouble(Double::doubleValue)
                                  .toArray();

assertArrayEquals(primitiveDoubles, unwrappedDoubles, 0.0001d);

Note that the Java 8 version works for int , long and double , but not for byte , as Arrays.stream() only具有—- T[] int[]long[] double[]

原文由 Sean Patrick Floyd 发布,翻译遵循 CC BY-SA 3.0 许可协议

你必须遍历你的数组。


在@seanizer 回答后更新:

基本上 toObject(byte[] array) 方法将为您执行循环:

 public static Byte[] toObject(byte[] array) {
    if (array == null) {
        return null;
    } else if (array.length == 0) {
        return EMPTY_BYTE_OBJECT_ARRAY;
    }
    final Byte[] result = new Byte[array.length];
    for (int i = 0; i < array.length; i++) {
        result[i] = new Byte(array[i]);
    }
    return result;
}

除非你真的要使用公共语言库,否则你应该简单地重用这个方法并避免无用的依赖(恕我直言)。

原文由 Colin Hebert 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题