我有一个数组我想变成List
,以便修改数组的内容。
Stack Overflow有很多问题/答案可以解决Arrays.asList()
以及它如何只提供底层数组的List视图,以及如何尝试操作生成的List通常会抛出UnsupportedOperationException
作为方法用于操纵列表(例如add()
,remove()
等)不是由Arrays.asList()
提供的列表实现实现的。
但我找不到如何将数组转换为可变List的示例。我想我可以循环遍历数组并将put()
每个值放入一个新的List中,但我想知道是否存在为我这样做的接口。
答案 0 :(得分:93)
一个简单的方法:
Foo[] array = ...;
List<Foo> list = new ArrayList<Foo>(Arrays.asList(array));
这将创建一个可变列表 - 但它将是原始数组的副本。更改列表将不更改阵列。您可以稍后使用toArray
将其复制回来。
如果你想在一个数组上创建一个可变的视图,我相信你必须自己实现它。
答案 1 :(得分:13)
如果您使用的是Google集合API
Lists.newArrayList(myArray)
答案 2 :(得分:5)
这个使用Java 8中包含的Stream API的简单代码创建了一个包含数组元素的可变列表(或视图):
Foo[] array = ...;
List<Foo> list = Stream.of(array).collect(Collectors.toCollection(ArrayList::new));
或同样有效:
List<Foo> list = Arrays.stream(array).collect(Collectors.toCollection(ArrayList::new));
答案 3 :(得分:4)
如果您使用的是Eclipse Collections(以前为GS Collections),则可以使用FastList.newListWith(...)
或FastList.wrapCopy(...)
。
这两种方法都采用varargs,因此您可以内联创建数组或传入现有数组。
MutableList<Integer> list1 = FastList.newListWith(1, 2, 3, 4);
Integer[] array2 = {1, 2, 3, 4};
MutableList<Integer> list2 = FastList.newListWith(array2);
两种方法的区别在于数组是否被复制。 newListWith()
不会复制数组,因此需要一段时间。如果您知道阵列可能在其他地方发生变异,则应该避免使用它。
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 Collections的提交者。
答案 4 :(得分:0)
myNewArrayList = new ArrayList<>(Arrays.asList(myArray));
答案 5 :(得分:0)
使用Streams API添加另一个选项:
List<Foo> list = Arrays.stream(array).collect(Collectors.toList());