Создать измененный список из массива?
У меня есть массив, который я бы хотел превратить в List
, чтобы изменить содержимое массива.
У есть много вопросов/ответов, которые адресуют Arrays.asList()
и как он предоставляет только представление List для базового массива и как попытка манипулировать результирующим списком обычно бросает UnsupportedOperationException
как методы, используемые для управления (например, add()
, remove()
и т.д.) не реализованы реализацией List, предоставленной Arrays.asList()
.
Но я не могу найти пример того, как превратить массив в изменяемый список. Я полагаю, что я могу пройти через массив и put()
каждое значение в новый список, но мне интересно, существует ли там интерфейс, чтобы сделать это для меня.
Ответы
Ответ 1
Один простой способ:
Foo[] array = ...;
List<Foo> list = new ArrayList<Foo>(Arrays.asList(array));
Это создаст измененный список - но это будет копия исходного массива. Изменение списка не изменит массив. Вы можете скопировать его позже, конечно, используя toArray
.
Если вы хотите создать изменяемое представление в массиве, я считаю, что вам придется реализовать это самостоятельно.
Ответ 2
И если вы используете API-интерфейс API google
Lists.newArrayList(myArray)
Ответ 3
Если вы используете Коллекции Eclipse (ранее Коллекции GS), вы можете использовать FastList.newListWith(...)
или FastList.wrapCopy(...)
.
Оба метода принимают varargs, поэтому вы можете создать массив inline или передать существующий массив.
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.
Ответ 4
myNewArrayList = new ArrayList(
Arrays.asList(
(Object[])myArray)));
Ответ 5
Этот простой код с использованием Stream API, включенного в Java 8, создает изменяемый список (или представление), содержащий элементы вашего массива:
Foo[] array = ...;
List<Foo> list = Stream.of(array).collect(Collectors.toCollection(ArrayList::new));
Или, что равнозначно:
List<Foo> list = Arrays.stream(array).collect(Collectors.toCollection(ArrayList::new));