将一个长整型数组转换为ArrayList<Long>

28

很遗憾,这不起作用:

long[] longs = new long[]{1L};
ArrayList<Long> longArray = new ArrayList<Long>(longs);

有没有比手动添加更好的方法?


5
与https://dev59.com/LHRA5IYBdhLWcg3w_DLF#1974363密切相关。 - Eran Medan
7个回答

48

使用来自apache commons-lang的ArrayUtils

long[] longs = new long[]{1L};
Long[] longObjects = ArrayUtils.toObject(longs);
List<Long> longList = java.util.Arrays.asList(longObjects);

+1 该死,我花了太长时间在ArrayUtils的javadoc上滚动了 :) - skaffman
2
我在Eclipse中打开了它(使用反编译器)。 - Bozho
1
这并不是很重要,但我不喜欢复制数组两次。最终我编写了一个实用函数来直接完成这个任务。 - ripper234

11

8
通过静态工厂实现 AbstractList,可以避免复制。对列表的所有更改都会写入数组中,反之亦然。
在某处创建此方法。
public static List<Long> asList(final long[] l) {
    return new AbstractList<Long>() {
        public Long get(int i) {return l[i];}
        // throws NPE if val == null
        public Long set(int i, Long val) {
            Long oldVal = l[i];
            l[i] = val;
            return oldVal;
        }
        public int size() { return l.length;}
    };
}

只需调用此方法即可创建数组。在声明中,您需要使用接口List而不是实现ArrayList

long[] longs = new long[]{1L, 2L, 3L};
List<Long> longArray = asList(longs);

我从语言指南中学到了这项技术。点击此处查看相关内容。

5
请注意使用 java.lang.Long,而不是 long
final Long[] longs = new Long[]{1L};
final List<Long> longArray = Arrays.asList(longs);

不添加任何第三方依赖。


如果可以更改问题,您可以直接使用Arrays.asList(),而不需要额外的ArrayList构造。 - Billy Bob Bain
肯定我们都想把问题变得更容易解决吧?因此我编辑了我的帖子,以反映韦恩(Wayne)更简洁的解决方案。一定要记得先读自己的帖子。 - Paul McKenzie

2
在JDK 1.8中,使用Lambda和Stream API,我们可以这样做:
long[] longArr = {3L, 4L, 5L, 6L, 7L};
List<Long> longBoxArr = Arrays.stream(longArr).boxed().collect(Collectors.toList());

我们需要将这个答案放在顶部。 - dermoritz

2

Bozho的答案不错,但我不喜欢复制数组两次。最终我自己编写了一个实用方法:

public static ArrayList<Long> convertArray(long[] array) {
  ArrayList<Long> result = new ArrayList<Long>(array.length);
  for (long item : array)
    result.add(item);
  return result;
}

2
请注意,在bozho的答案中,数组只复制了一次而不是两次:Arrays.asList不返回副本,而是返回一个包装器(该包装器实现List接口)。 第一次复制是必需的,因为Arrays.asList无法处理原始类型,因此需要将原始类型(long)转换为对象类型(Long)。请参阅Wayne Young的答案以获取直接包装器解决方案(根本不需要复制)。 - barjak
好吧,至少这是唯一给出的答案,它实际上返回一个ArrayList而不是List... - Thomas Hilger

-1

使用Dollar,您只需一行代码即可完成此转换:

long[] longs = new long[]{1L};
List<Long> longList = $(longs).toList();

你也可以轻松地将它们装箱:

Long[] arrayOfLongs = $(longs).toArray();

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