(取消)Java 中的原始数组装箱

问题描述 投票:0回答:4

在 Android Java 世界中,是否有一种直接的(最好是一次调用)方法将

int
数组转换为
ArrayList<Integer>
并返回?在 ArrayList 上调用
toArray()
返回一个
Integer
数组 - 不完全是我想要的。

我可以轻松地用循环手动完成此操作(事实上已经这样做了)。我想知道库/语言是否支持相同的。

编辑:谢谢大家,我已经编写了自己的拳击手和拆箱手。我只是很惊讶语言/RTL 设计者自己没有想到这一点,特别是原始类型在设计上不符合集合条件。

java android collections boxing
4个回答
13
投票

装箱和拆箱(无需特殊库):

// 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流文档)。

对于任何不知道

::
含义的人,它用于制作 方法参考


12
投票

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

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

请注意,与

Arrays.asList
一样,
Ints.asList
返回一个列表,该列表是给定数组的 view。您无法添加或删除其中的内容,但您可以
set
特定索引处的值。如果需要,您也可以将其复制到新的
ArrayList

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

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


4
投票

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

这是 h3xStream 答案的源代码(很高兴它使用 Apache 许可证);)


1
投票

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

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

我无法解释

Double[]::new
到底是什么意思,因为我之前并不知道 Java 8 的这个特性(事实上,IntelliJ IDEA 是为我写的),但看起来它正在做
new Double(double) 
数组的每个元素。

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

© www.soinside.com 2019 - 2024. All rights reserved.