将一个原始长整型数组转换成Long类型的List

150

这可能是一个非常简单的问题,但我的第一次尝试居然完全失败了。我想把一个原始长整型数组转换成列表,我尝试用以下代码实现:

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

如何正确地做到这一点?


7
我认为对于整数我们曾经有过同样的问题,是吗? - Tom Hawtin - tackline
3
@Tom,是的:https://dev59.com/R3M_5IYBdhLWcg3wPAdF - finnw
17个回答

5

使用Java 8的另一种方式

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

1
当返回列表时(而不是分配它),我发现我必须执行以下操作:Arrays.stream(a).boxed().collect(Collectors.<Long>toList()); - Jon
3
这与此现有答案完全相同。 - Pang

3
结合Pavel和Tom的回答,我们得到了以下内容。
   @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);
            }
        };
    }

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

如果源是整数数组,它也可以正常工作。


2

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

@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);

2
关于 catch (ArrayIndexOutOfBoundsException ex) { /* Finished getting array elements */ },你是一个可怕的人。 - Brandon Yarbrough
嘿,伙计,谢谢你!你讽刺的话让我找到了更好的解决方案——通过Array.getLength()获取数组的长度。 - Pavel Netesa
1
太棒了!我很高兴我的讽刺态度带来了进步,而不仅仅是普遍的不良情绪 :) 实际上,在非常特殊的情况下使用异常并不是一个好主意。它们的创建成本惊人地昂贵。这个新版本要快得多,快得多。 - Brandon Yarbrough

2
如果您想要与`Arrays.asList`类似的语义,那么您需要编写(或使用他人已有的)自定义实现的`List`(可能通过`AbstractList`实现)。它应该具有与`Arrays.asList`大致相同的实现,只需将值进行装箱和拆箱即可。

1

虽然可以通过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

在这里获取: https://github.com/Sf298/Sauds-Toolbox/blob/master/src/main/java/PrimitiveArrayWrapper/PrimitiveList.java

注意:我还没有完全测试过它,如果您发现任何错误或问题,请告诉我。


0
你可以使用 LongStream 来实现。
List<Long> longs = LongStream.of(new long[]{1L, 2L, 3L}).boxed()
                             .collect(Collectors.toList());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接