У меня есть массив, который я хотел бы превратить в List
, чтобы изменить содержимое массива.
В Stack Overflow есть множество вопросов / ответов, которые касаются Arrays.asList()
и того, как он предоставляет только представление списка базового массива, и то, как попытка манипулировать полученным списком обычно вызывает UnsupportedOperationException
методы, используемые для управления списком (например add()
, remove()
и т. Д.) не реализовано реализацией List, предоставленной Arrays.asList()
.
Но я не могу найти пример того, как превратить массив в изменяемый список. Я полагаю, что могу перебрать массив и put()
каждое значение в новый список, но мне интересно, существует ли интерфейс, который бы сделал это за меня.
И если вы используете API коллекции Google (Guava):
источник
new ArrayList<>(Arrays.asList(...))
- javadoc для метода подразумевает, что он станет устаревшим, потому что он недостаточно полезен.Этот простой код с использованием 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));
источник
Если вы используете 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.
источник
myNewArrayList = new ArrayList<>(Arrays.asList(myArray));
источник
myNewArrayList = new ArrayList(...)
, то есть к необработанному типу? Существует разница между «использованием оператора ромба, чтобы компилятор мог определить аргумент типа» и «использованием необработанного типа».Добавление еще одного варианта с использованием Streams API:
источник