这可能是一个非常简单的问题,但我的第一次尝试居然完全失败了。我想把一个原始长整型数组转换成列表,我尝试用以下代码实现:
long[] input = someAPI.getSomeLongs();
List<Long> inputAsList = Arrays.asList(input); //Total failure to even compile!
如何正确地做到这一点?
这可能是一个非常简单的问题,但我的第一次尝试居然完全失败了。我想把一个原始长整型数组转换成列表,我尝试用以下代码实现:
long[] input = someAPI.getSomeLongs();
List<Long> inputAsList = Arrays.asList(input); //Total failure to even compile!
如何正确地做到这一点?
@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);
}
};
}
Transmorph transmorph = new Transmorph(new DefaultConverters());
List<Long> = transmorph.convert(new long[] {1,2,3,4}, new TypeReference<List<Long>>() {});
如果源是整数数组,它也可以正常工作。
我知道这个问题已经很老了,但是...你也可以编写自己的转换方法:
@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);
catch (ArrayIndexOutOfBoundsException ex) { /* Finished getting array elements */ }
,你是一个可怕的人。 - Brandon Yarbrough虽然可以通过for循环或流的方式创建一个新的List并将所有值添加到其中,但我一直在处理非常大的数组,并且性能很差。因此,我创建了自己的易于使用的原始数组包装类。
示例:
long[] arr = new long[] {1,2,3};
PrimativeList<Long> list = PrimativeList.create(arr); // detects long[] and returns PrimativeList<Long>
System.out.println(list.get(1)); // prints: 2
list.set(2, 15);
System.out.println(arr[2]); // prints: 15
注意:我还没有完全测试过它,如果您发现任何错误或问题,请告诉我。
LongStream
来实现。List<Long> longs = LongStream.of(new long[]{1L, 2L, 3L}).boxed()
.collect(Collectors.toList());