在 Java 中将基元数组转换为容器数组
有没有一种优雅的方法可以将基元数组转换为相应容器对象的数组 - 例如,将a转换为a?还是我被困在循环浏览它并手动完成它?byte[]
Byte[]
是的,循环并不完全困难。只是有点丑陋。for
有没有一种优雅的方法可以将基元数组转换为相应容器对象的数组 - 例如,将a转换为a?还是我被困在循环浏览它并手动完成它?byte[]
Byte[]
是的,循环并不完全困难。只是有点丑陋。for
Apache Commons
Apache Commons / Lang有一个Class 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.
对这些数组支持的集合的好想法是
参见:番石榴解释/原始
爪哇 8
另一方面,使用Java 8 lambdas /流,您可以在不使用外部库的情况下使这些转换变得非常简单:
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);
请注意,Java 8 版本适用于 和 ,但不适用于 ,因为 Arrays.stream() 只有 、 或泛型对象的重载。int
long
double
byte
int[]
long[]
double[]
T[]
您必须遍历数组。
@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;
}
除非你真的使用commons lang lib,否则你应该简单地重用这种方法,避免无用的依赖关系(恕我直言)。