是否有一种优雅的方法将原语数组转换为相应容器对象的数组- 例如,将a byte[]转换为a Byte[]?还是我坚持循环浏览并手动执行?
byte[]
Byte[]
是的,for循环并不完全困难。有点丑。
for
Apache Commons
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);
番石榴
但是然后我会说,包装后的基元数组不是很有用,因此您可能想看看番石榴,它提供了所有数值类型的列表,并由基元数组支持:
List<Integer> intList = Ints.asList(1,2,3,4,5); List<Long> longList = Longs.asList(1L,2L,3L,4L,5L); // etc.
这些数组支持的集合的好主意是
参见:番石榴解释/原始
Java 8
另一方面,使用Java 8 lambda /流,您可以在不使用外部库的情况下使这些转换非常简单:
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版本适用int,long并且double,而不是byte作为Arrays.stream()只具有过载int[],long[],double[]或者一个通用的对象T[]。
int
long
double
byte
int[]
long[]
double[]
T[]