Преобразование массива в список на Java
как преобразовать массив в список на 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);
17 ответов:
в вашем примере это потому, что вы не можете иметь список примитивного типа. Другими словами,
List<int>не возможно. Вы можете, однако, иметьList<Integer>.Integer[] spam = new Integer[] { 1, 2, 3 }; Arrays.asList(spam);это работает, как ожидалось.
проблема в том, что varargs был введен в Java5 и, к сожалению,
Arrays.asList()получил перегружены с количеством аргументов версии. Так чтоArrays.asList(spam)понимается компилятором с java5 в качестве параметра количеством аргументов типа int массивы.эта проблема объясняется более подробно в эффективном Java 2nd Ed. Глава 7, Пункт 42.
говоря о способе преобразования, это зависит от того, зачем вам нужен ваш
List. Если вам это нужно просто для чтения данных. Хорошо, вот вы идете:Integer[] values = { 1, 3, 7 }; List<Integer> list = Arrays.asList(values);но тогда, если вы делаете что-то вроде этого:
list.add(1);вы получаете
java.lang.UnsupportedOperationException. Так что в некоторых случаях вам даже нужно это:Integer[] values = { 1, 3, 7 }; List<Integer> list = new ArrayList<Integer>(Arrays.asList(values));первый подход на самом деле не преобразует массив, но "представляет" его как
List. Но массив находится под капотом со всеми его свойствами, такими как фиксированное количество элементов. Пожалуйста, обратите внимание на вас необходимо указать тип при построенииArrayList.
в Java 8 можно использовать потоки:
int[] spam = new int[] { 1, 2, 3 }; Arrays.stream(spam) .boxed() .collect(Collectors.toList());
кажется, немного поздно, но вот мои два цента. Мы не можем иметь
List<int>какintявляется примитивным типом, поэтому мы можем иметь толькоList<Integer>.Java 8 (int array)
int[] ints = new int[] {1,2,3,4,5}; List<Integer> list11 =Arrays.stream(ints).boxed().collect(Collectors.toList());Java 8 и ниже (целочисленный массив)
Integer[] integers = new Integer[] {1,2,3,4,5}; List<Integer> list21 = Arrays.asList(integers); // Cannot modify returned list List<Integer> list22 = new ArrayList<>(Arrays.asList(integers)); // good List<Integer> list23 = Arrays.stream(integers).collect(Collectors.toList()); //Java 8 onlyнужен ArrayList, а не список?
в случае, если мы хотим конкретную реализацию
ListнапримерArrayListзатем мы можем использоватьtoCollectionкак:ArrayList<Integer> list24 = Arrays.stream(integers) .collect(Collectors.toCollection(ArrayList::new));
почему
list21не может быть структурно модифицированный?при использовании
Arrays.asListразмер возвращаемого списка фиксирован, потому что возвращаемый список неjava.util.ArrayList, но частный статический класс, определенный внутриjava.util.Arrays. Поэтому, если мы добавим или удалим элементы из возвращенного списка, тоUnsupportedOperationExceptionбудет брошен. Так что мы должны пойти сlist22когда мы хотим изменить список. Если у нас есть Java8, то мы также можем пойти сlist23.чтобы было понятно
list21может быть изменен в том смысле, что мы можем вызватьlist21.set(index,element)но этот список не может быть структурно изменен, т. е. не может добавлять или удалять элементы из списка. Вы также можете проверить это вопрос.
если мы хотим неизменяемый список, то мы можем обернуть его как:
List<Integer> list 22 = Collections.unmodifiableList(Arrays.asList(integers));еще один момент, чтобы отметить, что метод
Collections.unmodifiableListвозвращает неизменяемое представление указанного списка. Немодифицируемая коллекция представлений-это коллекция, которая не поддается изменению, а также представление на резервную коллекцию. Заметить что изменения в резервной коллекции все еще могут быть возможны, и если они происходят, они видны через немодифицируемое представление.мы можем иметь действительно неизменяемый список в Java 10.
Java 10 (поистине неизменяемый список) двумя способами:
List.copyOf(Arrays.asList(integers))Arrays.stream(integers).collect(Collectors.toUnmodifiableList());также проверьте это ответ Мой для большего.
недавно мне пришлось преобразовать массив в список. Позже программа отфильтровала список, пытаясь удалить данные. При использовании массивов.функция asList(array), вы создаете коллекцию фиксированного размера: вы не можете ни добавить, ни удалить. Эта запись объясняет проблему лучше, чем я: почему я получаю исключение UnsupportedOperationException при попытке удалить элемент из списка?.
в конце концов, мне пришлось сделать" ручное " преобразование:
List<ListItem> items = new ArrayList<ListItem>(); for (ListItem item: itemsArray) { items.add(item); }I полагаю, я мог бы добавить преобразование из массива в список с помощью списка.операция addAll (items).
Использование Массивов
это самый простой способ преобразовать массив в
List. Однако при попытке добавить новый элемент или удалить существующий элемент из списка,UnsupportedOperationExceptionбудет брошен.Integer[] existingArray = {1, 2, 3}; List<Integer> list1 = Arrays.asList(existingArray); List<Integer> list2 = Arrays.asList(1, 2, 3); // WARNING: list2.add(1); // Unsupported operation! list2.remove(1); // Unsupported operation!использование ArrayList или других реализаций списка
можно использовать
forцикл для добавления всех элементов массива вListреализации, например,ArrayList:List<Integer> list = new ArrayList<>(); for (int i : new int[]{1, 2, 3}) { list.add(i); }использование Stream API в Java 8
вы можно превратить массив в поток, а затем собрать поток с помощью различных коллекторов: коллектор по умолчанию в Java 8 использовать
ArrayListза экраном, но вы также можете навязать свою предпочтительную реализацию.List<Integer> list1, list2, list3; list1 = Stream.of(1, 2, 3).collect(Collectors.toList()); list2 = Stream.of(1, 2, 3).collect(Collectors.toCollection(ArrayList::new)); list3 = Stream.of(1, 2, 3).collect(Collectors.toCollection(LinkedList::new));Читайте также:
если вы ориентируетесь на Java 8 (или более поздней версии), вы можете попробовать это:
int[] numbers = new int[] {1, 2, 3, 4}; List<Integer> integers = Arrays.stream(numbers) .boxed().collect(Collectors.<Integer>toList());Примечание:
обратите внимание
Collectors.<Integer>toList(), этот универсальный метод поможет вам избежать ошибки " несоответствие типа: не удается преобразовать изList<Object>доList<Integer>".
еще один обходной путь, если вы используете Apache commons-lang:
int[] spam = new int[] { 1, 2, 3 }; Arrays.asList(ArrayUtils.toObject(spam));здесь ArrayUtils.toObject преобразование
int[]toInteger[]
Используя Гуава:
Integer[] array = { 1, 2, 3}; List<Integer> list = Lists.newArrayList(sourceArray);Использование Коллекций Apache Commons:
Integer[] array = { 1, 2, 3}; List<Integer> list = new ArrayList<>(6); CollectionUtils.addAll(list, array);
так это зависит от того, какую версию Java вы ищете-
Java 7
Arrays.asList(1, 2, 3);или
final String arr[] = new String[] { "G", "E", "E", "K" }; final List<String> initialList = new ArrayList<String>() {{ add("C"); add("O"); add("D"); add("I"); add("N"); }}; // Elements of the array are appended at the end Collections.addAll(initialList, arr);или
Integer[] arr = new Integer[] { 1, 2, 3 }; Arrays.asList(arr);В Java 8
int[] num = new int[] {1, 2, 3}; List<Integer> list = Arrays.stream(num) .boxed().collect(Collectors.<Integer>toList())ссылка - http://www.codingeek.com/java/how-to-convert-array-to-list-in-java/
Если это поможет: у меня была та же проблема, и я просто написал универсальную функцию, которая принимает массив и возвращает ArrayList того же типа с тем же содержимым:
public static <T> ArrayList<T> ArrayToArrayList(T[] array) { ArrayList<T> list = new ArrayList<T>(); for(T elmt : array) list.add(elmt); return list; }
используйте две строки кода для преобразования массива в список, если вы используете его в целочисленном значении вы должны использовать autoboxing type для примитивного типа данных
Integer [] arr={1,2}; Arrays.asList(arr);
Comments