101

我有一个数组,我想将其转换为List,以便修改数组的内容。

Stack Overflow 有很多问题/答案可以解决Arrays.asList(),它如何只提供底层数组的 List 视图,以及如何尝试操作结果 List 通常会抛出一个UnsupportedOperationException用于操作列表的方法(例如add()remove()等)是未由 提供的 List 实现实现Arrays.asList()

但我找不到如何将数组转换为可变列表的示例。我想我可以遍历数组并将put()每个值循环到一个新列表中,但我想知道是否存在一个接口可以为我执行此操作。

4

5 回答 5

138

一种简单的方法:

Foo[] array = ...;
List<Foo> list = new ArrayList<Foo>(Arrays.asList(array));

这将创建一个可变列表 - 但它将是原始数组的副本。更改列表不会更改数组。当然,您可以稍后将其复制回来,使用toArray.

如果你想在数组上创建一个可变视图,我相信你必须自己实现它。

于 2012-07-25T21:51:47.647 回答
34

如果您使用的是 google 集合 API(Guava):

Lists.newArrayList(myArray);
于 2013-10-11T13:11:11.340 回答
13

这个使用 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));
于 2017-01-28T01:55:27.553 回答
5

如果您使用的是Eclipse Collections(以前称为GS Collections),则可以使用FastList.newListWith(...)FastList.wrapCopy(...)

这两种方法都采用可变参数,因此您可以内联创建数组或传入现有数组。

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 的提交者。

于 2013-11-18T18:23:00.937 回答
0
myNewArrayList = new ArrayList<>(Arrays.asList(myArray));
于 2012-07-25T21:52:37.403 回答