Преобразование массива в список на 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);
744   17  

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 (поистине неизменяемый список) двумя способами:

  1. List.copyOf(Arrays.asList(integers))
  2. 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<Integer> list = Arrays.asList(1, 2, 3, 4);

Использование Массивов

это самый простой способ преобразовать массив в 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[] to Integer[]

One-liner:

List<Integer> list = Arrays.asList(new Integer[] {1, 2, 3, 4});

в Java 9 у вас есть еще более элегантное решение использования неизменяемых списков с помощью нового метода фабрики удобства List.of:

List<String> immutableList = List.of("one","two","three");

(бессовестно скопирован с здесь)

  1. Используя Гуава:

    Integer[] array = { 1, 2, 3};
    List<Integer> list = Lists.newArrayList(sourceArray);
    
  2. Использование Коллекций Apache Commons:

    Integer[] array = { 1, 2, 3};
    List<Integer> list = new ArrayList<>(6);
    CollectionUtils.addAll(list, array);
    

вы должны привести в массив

Arrays.asList((Object[]) 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

    Ничего не найдено.