eri*_*oco 64 java arrays list mutable
我有一个数组我想变成一个List
,以便修改数组的内容.
堆栈溢出有大量的问题/,解决答案Arrays.asList()
以及它如何仅提供底层阵列的列表视图,以及如何试图操纵所得列表通常将引发UnsupportedOperationException
如用来操纵列表方法(例如add()
,remove()
等)是没有由List提供的实现实现Arrays.asList()
.
但我找不到如何将数组转换为可变List的示例.我想我可以循环遍历数组并将put()
每个值循环到一个新的List中,但我想知道是否存在为我执行此操作的接口.
Jon*_*eet 100
一个简单的方法:
Foo[] array = ...;
List<Foo> list = new ArrayList<Foo>(Arrays.asList(array));
Run Code Online (Sandbox Code Playgroud)
这将创建一个可变列表 - 但它将是原始数组的副本.更改列表不会更改数组.您可以稍后将其复制回来,当然,使用toArray
.
如果你想在一个数组上创建一个可变的视图,我相信你必须自己实现它.
vsi*_*ngh 15
如果您使用谷歌收集API
Lists.newArrayList(myArray)
Run Code Online (Sandbox Code Playgroud)
这个使用Java 8中包含的Stream API的简单代码创建了一个包含数组元素的可变列表(或视图):
Foo[] array = ...;
List<Foo> list = Stream.of(array).collect(Collectors.toCollection(ArrayList::new));
Run Code Online (Sandbox Code Playgroud)
或者,同样有效:
List<Foo> list = Arrays.stream(array).collect(Collectors.toCollection(ArrayList::new));
Run Code Online (Sandbox Code Playgroud)
如果您使用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);
Run Code Online (Sandbox Code Playgroud)
两种方法之间的区别在于是否复制数组。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);
Run Code Online (Sandbox Code Playgroud)
注意:我是 Eclipse Collections 的提交者。
归档时间: |
|
查看次数: |
36285 次 |
最近记录: |