从数组创build可变列表?
我有一个数组,我想变成一个List
,以便修改数组的内容。
堆栈溢出有很多问题/答案,解决Arrays.asList()
,以及它如何只提供一个列表视图的底层数组,以及如何试图操纵结果列表通常会抛出一个UnsupportedOperationException
作为方法来操纵列表(例如add()
, remove()
等)不是由Arrays.asList()
提供的List实现实现的。
但是我找不到如何将数组变成可变列表的例子。 我想我可以遍历数组put()
每个值放入一个新的列表,但我想知道是否有一个接口存在为我做这个。
一个简单的方法:
Foo[] array = ...; List<Foo> list = new ArrayList<Foo>(Arrays.asList(array));
这将创build一个可变列表 – 但它将是原始数组的副本 。 更改列表不会改变数组。 您可以稍后复制它,当然,使用toArray
。
如果你想创build一个可变的视图到一个数组,我相信你将不得不自己实现。
如果你使用谷歌收集API的
Lists.newArrayList(myArray)
如果您使用Eclipse集合 (以前称为GS集合 ),则可以使用FastList.newListWith(...)
或FastList.wrapCopy(...)
。
两种方法都使用可变参数,因此您可以在内部创build数组或传入现有数组。
MutableList<Integer> list1 = FastList.newListWith(1, 2, 3, 4); Integer[] array2 = {1, 2, 3, 4}; MutableList<Integer> list2 = FastList.newListWith(array2);
两种方法的区别在于数组是否被复制。 newListWith()
不会复制数组,因此需要一段时间。 你应该避免使用它,如果你知道该arrays可能在其他地方突变。
Integer[] array2 = {1, 2, 3, 4}; MutableList<Integer> list2 = FastList.newListWith(array2); array2[1] = 5; Assert.assertEquals(FastList.newListWith(1, 5, 3, 4), list2); Integer[] array3 = {1, 2, 3, 4}; MutableList<Integer> list3 = FastList.wrapCopy(array3); array3[1] = 5; Assert.assertEquals(FastList.newListWith(1, 2, 3, 4), list3);
注意:我是Eclipse集合的提交者。
myNewArrayList = new ArrayList( Arrays.asList( (Object[])myArray)));
使用Java 8中包含的Stream API的简单代码将创build一个包含数组元素的可变列表(或视图):
Foo[] array = ...; List<Foo> list = Stream.of(array).collect(Collectors.toCollection(ArrayList::new));
或者同样有效:
List<Foo> list = Arrays.stream(array).collect(Collectors.toCollection(ArrayList::new));