【发布时间】:2010-12-31 02:07:00
【问题描述】:
遗憾的是,这不起作用:
long[] longs = new long[]{1L};
ArrayList<Long> longArray = new ArrayList<Long>(longs);
除了手动添加之外,还有更好的方法吗?
【问题讨论】:
标签: java list collections
遗憾的是,这不起作用:
long[] longs = new long[]{1L};
ArrayList<Long> longArray = new ArrayList<Long>(longs);
除了手动添加之外,还有更好的方法吗?
【问题讨论】:
标签: java list collections
在 JDK 1.8 中,使用 Lambda 和 Stream API,我们可以这样做:
long[] longArr = {3L, 4L, 5L, 6L, 7L};
List<Long> longBoxArr = Arrays.stream(longArr).boxed().collect(Collectors.toList());
【讨论】:
使用来自 apache commons-lang 的 ArrayUtils
long[] longs = new long[]{1L};
Long[] longObjects = ArrayUtils.toObject(longs);
List<Long> longList = java.util.Arrays.asList(longObjects);
【讨论】:
ArrayUtils javadoc :)
使用Dollar,您只需一行代码即可完成此转换:
long[] longs = new long[]{1L};
List<Long> longList = $(longs).toList();
您也可以轻松地将它们装箱:
Long[] arrayOfLongs = $(longs).toArray();
【讨论】:
注意使用java.lang.Long,而不是long
final Long[] longs = new Long[]{1L};
final List<Long> longArray = Arrays.asList(longs);
不添加任何第三方依赖项。
【讨论】:
由于其他人建议使用外部库,这里是 Google Guava libraries 方式:
long[] longs = {1L, 2L, 3L};
List<Long> longList = com.google.common.primitives.Longs.asList(longs);
【讨论】:
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;
}
【讨论】:
您可以通过静态工厂实现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);
我从language guide 学到了这项技术。
【讨论】: