我正在尝试使用以下代码将包含Integer对象的ArrayList转换为原始的int[],但它会抛出编译时错误。在Java中是否有可能进行转换?
List<Integer> x = new ArrayList<Integer>();
int[] n = (int[])x.toArray(int[x.size()]);
我正在尝试使用以下代码将包含Integer对象的ArrayList转换为原始的int[],但它会抛出编译时错误。在Java中是否有可能进行转换?
List<Integer> x = new ArrayList<Integer>();
int[] n = (int[])x.toArray(int[x.size()]);
int[] arr = list.stream().mapToInt(i -> i).toArray();
Stream<Integer>
IntStream
,并拆箱每个 Integer
对象所持有的 int
值(自 Java 5 以来自动完成)toArray
获取 int
数组您也可以通过方法引用明确调用 intValue
,例如:
int[] arr = list.stream().mapToInt(Integer::intValue).toArray();
NullPointerException
。可以通过向流管道添加过滤条件来轻松避免这种情况,例如: //.filter(Objects::nonNull) also works
int[] arr = list.stream().filter(i -> i != null).mapToInt(i -> i).toArray();
例子:
List<Integer> list = Arrays.asList(1, 2, 3, 4);
int[] arr = list.stream().mapToInt(i -> i).toArray(); //[1, 2, 3, 4]
list.set(1, null); //[1, null, 3, 4]
arr = list.stream().filter(i -> i != null).mapToInt(i -> i).toArray(); //[1, 3, 4]
你可以进行转换,但我认为没有内置的自动执行此操作的东西:
public static int[] convertIntegers(List<Integer> integers)
{
int[] ret = new int[integers.size()];
for (int i=0; i < ret.length; i++)
{
ret[i] = integers.get(i).intValue();
}
return ret;
}
(请注意,如果integers
或其中的任何元素为null
,则会引发NullPointerException异常。)
编辑:根据评论,您可能希望使用列表迭代器来避免使用诸如LinkedList
之类的列表时产生不良开销:
public static int[] convertIntegers(List<Integer> integers)
{
int[] ret = new int[integers.size()];
Iterator<Integer> iterator = integers.iterator();
for (int i = 0; i < ret.length; i++)
{
ret[i] = iterator.next().intValue();
}
return ret;
}
integers.stream().mapToInt(Integer::valueOf).toArray()
。 - Manish PatelGoogle Guava 提供了一种简洁的方法,通过调用 Ints.toArray
实现。
List<Integer> list = ...;
int[] values = Ints.toArray(list);
Apache Commons有一个ArrayUtils类,它有一个名为toPrimitive()的方法,可以实现这个功能。
import org.apache.commons.lang.ArrayUtils;
...
List<Integer> list = new ArrayList<Integer>();
list.add(new Integer(1));
list.add(new Integer(2));
int[] intArray = ArrayUtils.toPrimitive(list.toArray(new Integer[0]));
然而,正如Jon所示,与其使用外部库,自己完成这个任务相当容易。
toArray
一个提示,让它知道要创建哪种类型的数组。 - Nosrep我认为使用列表的迭代器进行迭代更好,因为list.get(i)
的性能取决于列表的实现而可能很差:
private int[] buildIntArray(List<Integer> integers) {
int[] ints = new int[integers.size()];
int i = 0;
for (Integer n : integers) {
ints[i++] = n;
}
return ints;
}
Java 8:
int[] intArr = Arrays.stream(integerList).mapToInt(i->i).toArray();
List<Integer> x = new ArrayList<>(Arrays.asList(7, 9, 13));
int[] n = new int[x.size()];
Arrays.setAll(n, x::get);
System.out.println("Array of primitive ints: " + Arrays.toString(n));
输出:
原始int数组:[7, 9, 13]
对于long
或double
类型的数组同样适用,但不适用于boolean
、char
、byte
、short
或float
类型的数组。如果你有一个非常大的列表,甚至可以使用parallelSetAll
方法。
对我来说,这已经足够好和优雅了,我不想使用外部库或者流来实现。
这对我很有效 :)
来源于 https://www.techiedelight.com/convert-list-integer-array-int/
import java.util.Arrays;
import java.util.List;
class ListUtil
{
// Program to convert list of integer to array of int in Java
public static void main(String args[])
{
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int[] primitive = list.stream()
.mapToInt(Integer::intValue)
.toArray();
System.out.println(Arrays.toString(primitive));
}
}
使用 Dollar 应该相当简单:
List<Integer> list = $(5).toList(); // the list 0, 1, 2, 3, 4
int[] array = $($(list).toArray()).toIntArray();
我计划改进DSL,以消除中间的toArray()
调用。
Arrays.setAll() 对于大多数情况都可以使用:
Integer List to primitive int array:
public static int[] convert(final List<Integer> list)
{
final int[] out = new int[list.size()];
Arrays.setAll(out, list::get);
return out;
}
Integer List (made of Strings) to primitive int array:
public static int[] convert(final List<String> list)
{
final int[] out = new int[list.size()];
Arrays.setAll(out, i -> Integer.parseInt(list.get(i)));
return out;
}
Integer array to primitive int array:
public static int[] convert(final Integer[] array)
{
final int[] out = new int[array.length];
Arrays.setAll(out, i -> array[i]);
return out;
}
Primitive int array to Integer array:
public static Integer[] convert(final int[] array)
{
final Integer[] out = new Integer[array.length];
Arrays.setAll(out, i -> array[i]);
return out;
}
List<Integer> x = new ArrayList<Integer>();
Integer[] n = x.toArray(new Integer[0]);
- Evorlor