Java中的(Un)装箱原始数组

时间:2011-05-19 20:31:16

标签: java android collections boxing

在Android Java世界中,是否有一种直接(理想情况下是一次调用)方式将int数组转换为ArrayList<Integer>并返回?在ArrayList上调用toArray()会返回一个Integer数组 - 这不是我想要的。

我可以通过循环手动轻松完成(事实上已经做过)。我想知道图书馆/语言是否支持相同的内容。

编辑:谢谢大家,我已经写了自己的拳击手和unboxer。我很惊讶语言/ RTL设计师自己没有想到它,特别是原始类型的设计不适合收藏。

5 个答案:

答案 0 :(得分:10)

使用GuavaInts.asList(int...)Ints.toArray(Collection<Integer>)):

int[] intArray = ...
List<Integer> intArrayAsList = Ints.asList(intArray);
int[] intArray2 = Ints.toArray(intArrayAsList);

请注意,与Arrays.asList一样,Ints.asList会返回一个列表,该列表是给定数组的视图。您无法添加或删除它,但您可以set特定索引处的值。如果您愿意,也可以将其复制到新的ArrayList

List<Integer> arrayList = Lists.newArrayList(Ints.asList(intArray));

Guava对所有原始类型都有相同的方法。

答案 1 :(得分:4)

如果您创建的实用程序方法是一次调用转换。也许在你的情况下,这比添加一个完整的库(你可能只使用一个函数)更好,尽管这对你的应用来说应该是太多的负担。

这是h3xStream答案的source code(很高兴它使用Apache许可证);)

答案 2 :(得分:3)

装箱和拆箱(没有特殊库):

// Necessary Imports:
import java.util.*;
import java.util.stream.*;

// Integers:
int[] primitives = {1, 2, 3};
Integer[] boxed = Arrays.stream(primitives).boxed().toArray(Integer[]::new);
int[] unboxed = Arrays.stream(boxed).mapToInt(Integer::intValue).toArray();

// Doubles:
double[] primitives = {1.0, 2.0, 3.0};
Double[] boxed = Arrays.stream(primitives).boxed().toArray(Double[]::new);
double[] unboxed = Arrays.stream(boxed).mapToDouble(Double::doubleValue).toArray();

请注意,这需要 Java 8 Stream Documentation)。

对于不知道::含义的人,它曾用于制作Method Reference

答案 3 :(得分:1)

来自Apache的

Common.Lang有一个实用程序类:ArrayUtils

答案 4 :(得分:1)

我设法在 Java 8 中找到了解决方案:

import java.util.Arrays;
...
double[] columnsValue = {...};
Double[] values = Arrays.stream(columnsValue).boxed().toArray(Double[]::new);

我无法解释Double[]::new到底意味着什么,因为我之前并不知道 Java 8 的这个功能(事实上, IntelliJ IDEA < / em>为我写了这个,但看起来它正在对数组的每个元素进行new Double(double)

请注意:我仅在桌面上对此进行了测试,我不知道它是否适用于Android。