将原始长整型数组转换为长整型列表

这可能是一个简单的头脑问题,但我的第一个尝试令人惊讶的完全失败了。 我想采取一系列的原始长度,并把它变成一个列表,我试图这样做:

long[] input = someAPI.getSomeLongs(); List<Long> inputAsList = Arrays.asList(input); //Total failure to even compile! 

什么是正确的方法来做到这一点?

我发现使用apache commons lang ArrayUtils( JavaDoc )

 long[] input = someAPI.getSomeLongs(); Long[] inputBoxed = ArrayUtils.toObject(input); List<Long> inputAsList = Arrays.asList(inputBoxed); 

它也有相反的API

 long[] backToPrimitive = ArrayUtils.toPrimitive(objectArray); 

编辑:更新提供一个完整的转换为build议的意见和其他修复。

从Java 8开始,您现在可以使用以下stream:

 long[] arr = {1,2,3,4}; List<Long> list = Arrays.stream(arr).boxed().collect(Collectors.toList()); 
 import java.util.Arrays; import org.apache.commons.lang.ArrayUtils; List<Long> longs = Arrays.asList(ArrayUtils.toObject(new long[] {1,2,3,4})); 

hallidave和jpalecek有正确的想法 – 遍历一个数组 – 但他们没有利用由ArrayList提供的一个特性:因为列表的大小在这种情况下是已知的 ,所以在创buildArrayList时应该指定它。

 List<Long> list = new ArrayList<Long>(input.length); for (long n : input) list.add(n); 

这样,就不会创build不必要的数组,因为它们会变得太短,并且不会浪费空的“槽”,因为ArrayList高估了它的空间需求。 当然,如果继续向列表添加元素,则需要新的后备数组。

有点冗长,但是这个工作:

  List<Long> list = new ArrayList<Long>(); for (long value : input) { list.add(value); } 

在你的例子中,似乎Arrays.asList()将input解释为long []数组的列表,而不是Long的列表。 有点奇怪,当然。 在这种情况下,自动装箱就不能按照你想要的方式工作。

作为另一种可能性, Guava库将其作为Longs.asList() ,并为其他基本types提供相似的实用程序类。

 import com.google.common.primitives.Longs; long[] input = someAPI.getSomeLongs(); List<Long> output = Longs.asList(input); 

不,从基本types的数组到其盒装引用types的数组没有自动转换。 你只能这样做

 long[] input = someAPI.getSomeLongs(); List<Long> lst = new ArrayList<Long>(); for(long l : input) lst.add(l); 

我正在为这些问题写一个小图书馆:

 long[] input = someAPI.getSomeLongs(); List<Long> = $(input).toList(); 

在这种情况下,你在这里检查它。

结合帕维尔和汤姆的答案,我们得到了这一点

  @SuppressWarnings("unchecked") public static <T> List<T> asList(final Object array) { if (!array.getClass().isArray()) throw new IllegalArgumentException("Not an array"); return new AbstractList<T>() { @Override public T get(int index) { return (T) Array.get(array, index); } @Override public int size() { return Array.getLength(array); } }; } 

如果你想要类似Arrays.asList语义,那么你需要编写(或使用别人的) List的客户实现(可能通过AbstractList 。它应该有很多与Arrays.asList相同的实现,只有box和unbox的值。

我知道这个问题已经够老了,但是…你也可以编写你自己的转换方法:

 @SuppressWarnings("unchecked") public static <T> List<T> toList(Object... items) { List<T> list = new ArrayList<T>(); if (items.length == 1 && items[0].getClass().isArray()) { int length = Array.getLength(items[0]); for (int i = 0; i < length; i++) { Object element = Array.get(items[0], i); T item = (T)element; list.add(item); } } else { for (Object i : items) { T item = (T)i; list.add(item); } } return list; } 

在使用静态导入包含它之后,可能的用法可能是:

  long[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; List<Long> list = toList(array); 

要么

  List<Long> list = toList(1l, 2l, 3l, 4l, 5l, 6l, 7l, 8l, 9l); 

Java 8的另一种方法 。

 final long[] a = new long[]{1L, 2L}; final List<Long> l = Arrays.stream(a).boxed().collect(Collectors.toList()); 

Java 8的另一种方法。

 long[] input = someAPI.getSomeLongs(); LongStream.of(input).boxed().collect(Collectors.toList())); 

你可以使用transmorph :

 Transmorph transmorph = new Transmorph(new DefaultConverters()); List<Long> = transmorph.convert(new long[] {1,2,3,4}, new TypeReference<List<Long>>() {}); 

如果source是一个int数组,例如它也可以。