Как мне преобразовать массив в список в Java?
Я использовал, Arrays.asList()
но поведение (и подпись) каким-то образом изменилось с Java SE 1.4.2 (документы теперь в архиве) на 8, и большинство фрагментов, которые я нашел в Интернете, используют поведение 1.4.2.
Например:
int[] spam = new int[] { 1, 2, 3 };
Arrays.asList(spam)
- на 1.4.2 возвращает список, содержащий элементы 1, 2, 3
- на 1.5.0+ возвращает список, содержащий массив спама
Во многих случаях это должно быть легко обнаружить, но иногда это может ускользнуть незамеченным:
Assert.assertTrue(Arrays.asList(spam).indexOf(4) == -1);
java
arrays
list
data-conversion
Александр
источник
источник
Arrays.asList(new int[] { 1, 2, 3 })
; определенно не компилировать Java 1.4.2, так какint[]
это неObject[]
.Arrays.asList
должен работать.Ответы:
В вашем примере это потому, что вы не можете иметь список примитивного типа. Другими словами,
List<int>
это невозможно.Однако вы можете
List<Integer>
использоватьInteger
класс, который обертываетint
примитив. Преобразуйте ваш массив вList
с помощьюArrays.asList
служебного метода.Смотрите этот код в прямом эфире на IdeOne.com .
источник
List<Integer[]>
?Integer[] integerArray1 = { 1 }; Integer[] integerArray2 = { 2 }; List<Integer[]> integerArrays = Arrays.asList(integerArray1, integerArray2);
В Java 8 вы можете использовать потоки:
источник
boolean[]
. Я думаю, это потому, что это так же легко сделатьBoolean[]
. Это, вероятно, лучшее решение. Во всяком случае, это интересная причуда.Если говорить о конверсии, то это зависит от того, зачем вам нужен
List
. Если вам это нужно только для чтения данных. Хорошо, вот и вы:Но тогда, если вы делаете что-то вроде этого:
Вы получаете
java.lang.UnsupportedOperationException
. Так что для некоторых случаев вам даже нужно это:Первый подход на самом деле не конвертирует массив, а «представляет» его как a
List
. Но массив находится под капотом со всеми его свойствами, такими как фиксированное количество элементов. Обратите внимание, что вам нужно указать тип при построенииArrayList
.источник
Проблема в том, что varargs были введены в Java5 и, к сожалению,
Arrays.asList()
перегружены также версией vararg. ТакArrays.asList(spam)
понимается компилятором Java5 как параметр vararg массивов int.Эта проблема объясняется более подробно в Effective Java 2nd Ed., Глава 7, Item 42.
источник
Кажется, немного поздно, но вот мои два цента. Мы не можем иметь
List<int>
какint
примитивный тип, так что мы можем иметь толькоList<Integer>
.Java 8 (массив int)
Java 8 и ниже (целочисленный массив)
Нужен ArrayList, а не список?
В случае, если мы хотим конкретную реализацию,
List
например,ArrayList
тогда мы можем использоватьtoCollection
как:Почему
list21
нельзя структурно изменить?Когда мы используем
Arrays.asList
размер возвращаемого списка, он фиксируется, потому что возвращаемый список - это неjava.util.ArrayList
закрытый статический класс, определенный внутриjava.util.Arrays
. Поэтому, если мы добавим или удалим элементы из возвращенного списка,UnsupportedOperationException
будет выброшено. Таким образом, мы должны идти,list22
когда мы хотим изменить список. Если у нас есть Java8, то мы можем пойти дальшеlist23
.Чтобы быть понятным,
list21
можно изменить в том смысле, что мы можем вызвать,list21.set(index,element)
но этот список не может быть структурно изменен, т.е. не может добавлять или удалять элементы из списка. Вы также можете проверить этот вопрос .Если мы хотим неизменный список, мы можем обернуть его следующим образом:
Еще один момент, на который следует обратить внимание: метод
Collections.unmodifiableList
возвращает неизменяемое представление указанного списка. Неизменяемая коллекция представлений - это коллекция, которая не модифицируется, а также является представлением резервной коллекции. Обратите внимание, что изменения в резервной коллекции все еще возможны, и если они происходят, они видны через неизменяемое представление.У нас может быть действительно неизменный список в Java 9 и 10.
Действительно неизменный список
Java 9:
Java 10 (действительно неизменный список) двумя способами:
List.copyOf(Arrays.asList(integers))
Arrays.stream(integers).collect(Collectors.toUnmodifiableList());
Также проверьте мой ответ для получения дополнительной информации.
источник
List::add
&List::remove
не удается с помощью списка, возвращенногоArrays.asList
. JavaDoc для этого метода плохо написан и неясен по этому вопросу. В третьем чтении я полагаю, что фраза «фиксированного размера» означала, что нельзя добавлять или удалять элементы.Еще короче
источник
Недавно мне пришлось преобразовать массив в список. Позже программа отфильтровала список, пытаясь удалить данные. Когда вы используете функцию Arrays.asList (array), вы создаете коллекцию фиксированного размера: вы не можете ни добавлять, ни удалять. Эта запись объясняет проблему лучше, чем я: почему я получаю исключение UnsupportedOperationException при попытке удалить элемент из списка? ,
В итоге мне пришлось сделать «ручное» преобразование:
Я полагаю, я мог бы добавить преобразование из массива в список, используя операцию List.addAll (items).
источник
new ArrayList<ListItem>(Arrays.asList(itemsArray))
будет к тому жеCollections.addAll(items, itemsArray)
вместо этого.Использование массивов
Это самый простой способ конвертировать массив в
List
. Однако, если вы попытаетесь добавить новый элемент или удалить существующий элемент из списка,UnsupportedOperationException
будет выброшено.Использование ArrayList или других реализаций списков
Вы можете использовать
for
цикл для добавления всех элементов массива вList
реализацию, напримерArrayList
:Использование Stream API в Java 8
Вы можете превратить массив в поток, а затем собрать поток с помощью различных сборщиков: сборщик по умолчанию в Java 8 используется
ArrayList
за экраном, но вы также можете навязать предпочтительную реализацию.Смотрите также:
источник
Другой обходной путь, если вы используете apache commons-lang:
Где ArrayUtils.toObject конвертируется
int[]
вInteger[]
источник
Вы должны бросить в массив
источник
Один лайнер:
источник
В Java 9 у вас есть еще более элегантное решение использования неизменяемых списков с помощью нового метода фабрики удобства
List.of
:(бесстыдно скопировано отсюда )
источник
Если вы ориентируетесь на Java 8 (или более позднюю версию), вы можете попробовать это:
НОТА:
Обратите внимание
Collectors.<Integer>toList()
, что этот универсальный метод помогает избежать ошибки «Несоответствие типов: невозможно преобразовать изList<Object>
вList<Integer>
».источник
Использование гуавы:
Использование коллекций Apache Commons:
источник
Если это помогает: у меня возникла та же проблема, и я просто написал универсальную функцию, которая принимает массив и возвращает ArrayList того же типа с тем же содержимым:
источник
Данный массив:
Преобразование целочисленного массива в список целых
Один из способов: boxed () -> возвращает IntStream
Второй способ: сопоставить каждый элемент потока с целым числом, а затем собрать
ПРИМЕЧАНИЕ. Используя mapToObj, вы можете преобразовать каждый элемент int в поток строк, символьный поток и т. Д., Указав регистр i в (char) i
Пример преобразования одного массива в другой тип:
источник
Так что это зависит от того, какую версию Java вы пытаетесь
Java 7
ИЛИ
ИЛИ
В Java 8
Ссылка - http://www.codingeek.com/java/how-to-convert-array-to-list-in-java/
источник
Можете ли вы улучшить этот ответ, пожалуйста, так как это то, что я использую, но я не на 100% ясно. Работает нормально, но IntelliJ добавил новую WeatherStation [0]. Почему 0?
источник
используйте две строки кода для преобразования массива в список, если вы используете его в целочисленном значении, вы должны использовать тип автобокса для примитивного типа данных
источник