Как преобразовать список в массив java
Перейти к содержимому

Как преобразовать список в массив java

  • автор:

Преобразование списка в массив в Java

В этом посте мы обсудим, как преобразовать список в массив в Java.

1. Использование List.toArray() метод

List интерфейс обеспечивает toArray() метод, возвращающий Object массив, содержащий элементы списка.

List list = Arrays . asList ( «C» , «C++» , «Java» ) ;
Object [ ] array = list . toArray ( ) ;
System . out . println ( Arrays . toString ( array ) ) ;

JVM не знает желаемого типа объекта, поэтому toArray() метод возвращает Object[] . Мы можем передать типизированный массив в перегруженный toArray(T[] a) чтобы сообщить JVM о желаемом типе объекта.

List list = Arrays . asList ( «C» , «C++» , «Java» ) ;
String [ ] array = list . toArray ( new String [ list . size ( ) ] ) ;
System . out . println ( Arrays . toString ( array ) ) ;

Мы также можем передать пустой массив (или массив любого размера) указанного типа, и JVM выделит необходимую память:

List list = Arrays . asList ( «C» , «C++» , «Java» ) ;
String [ ] array = list . toArray ( new String [ 0 ] ) ;
System . out . println ( Arrays . toString ( array ) ) ;

2. Использование Java 8

В Java 8 мы можем использовать Stream для преобразования списка в массив. Идея состоит в том, чтобы преобразовать данный список в поток, используя List.stream() метод и использует Stream.toArray() метод для возврата массива, содержащего элементы потока. Есть два способа сделать это:

⮚ Использование потоков со ссылкой на метод

List list = Arrays . asList ( «C» , «C++» , «Java» ) ;
String [ ] array = list . stream ( ) . toArray ( String [ ] :: new ) ;
System . out . println ( Arrays . toString ( array ) ) ;

⮚ Использование потоков с лямбда-выражением

List list = Arrays . asList ( «C» , «C++» , «Java» ) ;
String [ ] array = list . stream ( ) . toArray ( n -> new String [ n ] ) ;
System . out . println ( Arrays . toString ( array ) ) ;

3. Использование библиотеки Guava

⮚ Использование FluentIterable class

The FluentIterable представляет собой расширенный Iterable API, который обеспечивает функциональность, аналогичную библиотеке потоков Java 8, но немного другим способом. Идея состоит в том, чтобы получить плавный итерируемый объект, который обертывает итерируемый список и возвращает массив, содержащий все его элементы в порядке итерации.

Java list to array: преобразуем список элементов в массив

Java-университет

Java list to array: преобразуем список элементов в массив - 1

Привет! В данной статье мы рассмотрим, как в Java преобразовать список элементов в массив элементов. Собственно, способов сделать это не так уж и много, и все они простые, так что статья будет несложной. Сразу же определимся, с чем мы работаем. Будем конвертировать списки в массивы, а конкретнее — список строк: I, love, learning, on, JavaRush будем преобразовывать в массив таких же строк. Но для начала маленький бонус. Расскажем о том, как по быстрому запилить списочек.

Как по быстрому запилить списочек list to array

Запомни: в этой жизни есть два сценария. Первый — полнейшая тоска и скука, когда мы инициализируем новый список:

 List wordsList = new ArrayList(); 

А потом добавляем в него значения. По одному…

 wordsList.add("I"); wordsList.add("love"); wordsList.add("learning"); wordsList.add("on"); wordsList.add("JavaRush"); 

Никуда не годится. Уже забыл, зачем нужен был список, пока его создавал! Второй путь — отсечение всего лишнего и принятие. классов утилит. Например, класса Arrays , в котором есть невероятно удобный метод asList . В него можно передавать все, что ты хочешь сделать списком, и метод сделает это списком. Вот примерно так:

 List wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush"); 

Данный метод принимает в себя varargs — в некотором смысле массив. Прошу прощения за то, что в лекции под названием list to array я научил тебя сначала array to list, но того требовали обстоятельства. Ну а теперь к нашим методам перевода списков в массивы.

Способ №1. Перебор

Способ отлично подойдет тем, кто любит не особо вдумчиво набирать код на клавиатуре. Своего рода медитация. Шаг 1. Создаем массив такой же длины, как и список:

 List wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush"); String[] wordsArray = new String[wordsList.size()]; 

Шаг 2. Создаем цикл со счетчиком, чтобы пробежаться по всем элементам списка и иметь возможность обращаться к ячейкам массива по индексу:

 for (int i = 0; i

Шаг 3. Внутри цикла значение каждого элемента списка с индексом i присваиваем ячейке массива с индексом i:

 for (int i = 0; i
 public static void main(String[] args) < ListwordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush"); String[] wordsArray = new String[wordsList.size()]; for (int i = 0; i < wordsList.size(); i++) < wordsArray[i] = wordsList.get(i); >> 

Способ №2. Метод toArray

Наверное, самая оптимальная в использовании штуковина. В интерфейсе List есть два метода toArray , которые из текущего списка создают массив:

 Object[] toArray(); T[] toArray(T[] a); 

Первый метод возвращает массив объектов, в котором расположены все элементы текущего списка (от первого до последнего):

 public class Main < public static void main(String[] args) < ListwordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush"); String[] wordsArray = (String[]) wordsList.toArray(); for (String word : wordsArray) < System.out.println(word); >> > 

Запустим метод main и увидим следующее:

 I love learning on JavaRush 

Однако у данного метода есть особенность: он всегда возвращает массив объектов (Object[]) . Поэтому возвращаемый результат необходимо привести к нужному типу данных. В примере выше мы привели его к массиву строк (String[]) . Зато данный метод не принимает аргументов, что в некоторых ситуациях может быть удобно. Второй метод также возвращает массив, в котором расположены все элементы текущего списка (от первого до последнего). Однако в отличие от первого, второй метод принимает в качестве аргумента массив определенного типа. Но и результатом работы второго метода будет не массив объектов, а массив определенного типа данных — такого же, как и тип данных в переданном в аргументы методе массива.

 public class Main < public static void main(String[] args) < ListwordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush"); String[] wordsArray = wordsList.toArray(new String[0]); for (String word : wordsArray) < System.out.println(word); >> > 

Если запустить метод main , в выводе мы увидим все те же слова:

 I love learning on JavaRush 

Поговорим немного о массиве, который передается в качестве аргумента методу toArray . Логика работы метода зависит от длины передаваемого массива. Есть три возможные сценария:

1. Длина передаваемого массива меньше, чем длина списка

В этом случае метод создает новый массив и помещает в него элементы списка. Мы продемонстрировали это в примере выше.

2. Длина передаваемого элемента равна длине списка

Метод поместит элементы списка в переданный массив. Продемонстрируем это:

 public class Main < public static void main(String[] args) < ListwordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush"); // Создаем пустой массив нужной длины String[] array = new String[wordsList.size()]; // Отправляем пустой массив в метод toArray wordsList.toArray(array); // Проверяем, заполнился ли наш массив. Спойлер: да for (String word : array) < System.out.println(word); >> > 

При выводе мы увидим все те же строки, и станет ясно, что метод заполнил созданный нами массив.

3. Длина передаваемого массива больше, чем длина списка

Метод запишет все элементы списка в массив, а в следующую за последним добавленным элементом ячейку запишет значение null . Продемонстрируем это:

 public class Main < public static void main(String[] args) < ListwordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush"); // Создаем пустой массив, длина которого в 2 раза больше длины списка String[] array = new String[wordsList.size() * 2]; for (int i = 0; i < array.length; i++) < // В каждую ячейку запишем строковое представление текущего индекса array[i] = String.valueOf(i); >// Отправляем массив в метод toArray wordsList.toArray(array); // Проверяем, что лежит в нашем массиве for (String word : array) < System.out.println(word); >> > 

После запуска метода main в консоли увидим следующее:

 I love learning on JavaRush null 6 7 8 9 

Какой же метод из трех выбрать? В ранних версиях Java было оптимально передавать массив с длиной равной длине списка или больше нее. Однако в современных JVM есть оптимизации, и в некоторых случаях они обеспечивают более быструю работу метода, в который передается массив меньшей длины, чем длина списка. Так что если вы работаете на современной версии Java, передавайте в метод пустой массив, как мы делали в первом примере:

 wordsList.toArray(new String[0]); 

Способ №3. Stream API

Данный способ подойдет тем, кто хочет не просто перевести список в массив, но и попутно решить пару тройку других задач. А еще — людям, знакомым с Java Stream API. На JavaRush есть неплохая статья на эту тему. В данном разделе мы разберем несколько примеров с использованием стримов. Как с помощью стримов привести список к массиву:

 public class Main < public static void main(String[] args) < ListwordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush"); String[] strings = wordsList.stream() .toArray(String[]::new); for (String s : strings) < System.out.println(s); >/* Output: I love learning on JavaRush */ > > 

Но если вам просто нужно привести список к массиву, то лучше сделать это с помощью метода toArray , описанном в разделе Способ №2. А вот если вы хотите не просто привести список к массиву, а еще и произвести некоторое действие над каждым элементом, тогда вам по адресу. Попробуем привести список к массиву так, чтобы в итоговом массиве все строки были записаны в верхнем регистре:

 public class Main < public static void main(String[] args) < ListwordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush"); String[] strings = wordsList.stream() .map(str -> str.toUpperCase()) .toArray(String[]::new); for (String s : strings) < System.out.println(s); >/* Output: I LOVE LEARNING ON JAVARUSH */ > > 

Здесь, в .map(str -> str.toUpperCase()) мы определили, что нужно сделать с каждой строкой в списке. В данном случае мы решили преобразовывать каждую строку в верхний регистр, а затем собирать ее в массив. Использование Stream API позволяет не только преобразовывать каждое значение, но и фильтровать их. Предположим, мы хотим из списка строк собрать массив, но таким образом, чтобы в массив попали только строки длиной более двух символов:

 public class Main < public static void main(String[] args) < ListwordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush"); String[] strings = wordsList.stream() .filter(str -> str.length() > 2) .map(str -> str.toUpperCase()) .toArray(String[]::new); for (String s : strings) < System.out.println(s); >/* Output: LOVE LEARNING JAVARUSH */ > > 

Здесь в строке .filter(str -> str.length() > 2) мы создали так называемый фильтр, который будет применяться к каждому элементу списка, прежде чем он попадет в массив. В данном случае у каждой строки вызывается метод length() , и если результат выражения str.length() > 2 истинный, такая строка попадет в результирующую выборку, а в итоге в массив. Иначе — не попадет. Здесь, пожалуй, стоит сказать, что того же можно добиться, просто перебирая элементы и накладывая различные ограничения. Можно делать и так. Stream API предоставляет более функциональный подход для решения подобных задач.

Итоги

  • простой перебор;
  • метод toArray;
  • Stream API.
  • Object[] toArray();
  • T[] toArray(T[] a);

Домашка

Попробуйте повторить все примеры из данной статьи самостоятельно, только вместо исходного списка строк используйте список целых чисел от 0 до 10. Естественно, некоторые условия из примеров, применимые только для строк, вам придется адаптировать под новые условия.

Rukovodstvo

статьи и идеи для разработчиков программного обеспечения и веб-разработчиков.

Преобразование массива JSON в массив или список Java с помощью Джексона

Введение В этой статье мы преобразуем массив JSON в массив Java и список Java с помощью Джексона. Поскольку мы используем Джексона, вам придется добавить его в свой проект. Если вы используете Maven, это так же просто, как добавить зависимость: com.fasterxml.jackson.core Jackson-Databind 2.11.2 Или, если вы используете Gradle: compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', версия:

Время чтения: 3 мин.

Вступление

В этой статье мы преобразуем массив JSON в массив Java и список Java с помощью Джексона .

Поскольку мы используем Джексона, вам придется добавить его в свой проект. Если вы используете Maven, это так же просто, как добавить зависимость:

  com.fasterxml.jackson.core jackson-databind 2.11.2  

Или, если вы используете Gradle:

 compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.11.2' 

Поскольку мы сопоставляем JSON с нашими собственными объектами, давайте продолжим и определим POJO:

 public class Language < private String name; private String description; // Getters, setters and toString() method 

Чтение JSON из строки

Начнем с чтения JSON из строки. Строка содержит массив языков программирования с краткими описаниями:

 String json = "[,, ]"; 

Используя ObjectMapper , легко читать значения и сопоставлять их с объектом или массивом объектов. Мы просто используем метод readValue() , передавая содержимое JSON и класс, которому мы хотим сопоставить. Поскольку мы сопоставляем массив Language , мы также укажем это в readValue() :

 // It's advised to use ObjectMapper as a singleton and reuse the instance final ObjectMapper objectMapper = new ObjectMapper(); Language[] langs = objectMapper.readValue(json, Language[].class); 

В качестве альтернативы вы можете извлечь значения непосредственно в список, используя TypeReference Джексона:

 List langList = objectMapper.readValue(json, new TypeReference()<>); 

Без использования TypeReference<> , который рекомендуется, вы можете преобразовать массив в список любым другим подходом, имеющимся в вашем распоряжении, например:

 List langList = new ArrayList(Arrays.asList(langs)); 

А затем распечатайте значения:

 langList.forEach(x -> System.out.println(x.toString())); 
 Language Language Language

Чтение JSON из файла

Мы не всегда имеем дело с JSON в строковом формате. Часто содержимое поступает из File . К счастью, Джексон делает эту задачу такой же простой, как и предыдущую, мы просто передаем File readValue() :

 final ObjectMapper objectMapper = new ObjectMapper(); List langList = objectMapper.readValue( new File("langs.json"), new TypeReference()<>); langList.forEach(x -> System.out.println(x.toString())); 

Выполнение этого кода приводит к:

 Language Language Language

Заключение

В этой статье мы использовали Джексона для анализа и отображения значений из строки и файла JSON в массив и список Java.

Это делается с помощью readValue() , путем указания содержимого JSON (строки или файла) и указания POJO, с которым мы хотели бы сопоставить.

Licensed under CC BY-NC-SA 4.0

Отличия Arrays.asList() и List.of() в Java

Отличия между Arrays.asList() and List.of() в Java

Иногда в Java нам нужно создать небольшой список или преобразовать массив в список для удобства. Java предоставляет для этого несколько вспомогательных методов.

В этой статье мы сравним два основных способа инициализации коллекций: List.of() и Array.asList().

Использование Arrays.asList()

Метод Arrays.asList(), который является частью Java Collections Framework, введенный в Java 1.2, упрощает создание списков. Он может принимать массив в качестве входных данных и создавать фиксированный List объектов из предоставленного массива:

Integer[] array = new Integer[]; List list = Arrays.asList(array);

Как видно, создать простой список целых чисел очень легко.

Неподдерживаемые операции в возвращаемом списке

Метод asList() возвращает список фиксированного размера. Следовательно, добавление и удаление новых элементов вызывает исключение UnsupportedOperationException:

List list = Arrays.asList(1, 2, 3, 4, 5, 6); list.add(7); list.remove(1); // Exception in thread "main" java.lang.UnsupportedOperationException

Важно отметить, что список не создает копию входного массива. Вместо этого он оборачивает исходный массив с помощью интерфейса List. Следовательно, изменения в массиве отражаются и на списке:

Мы должны отметить, что список не создает копию входного массива. Вместо этого он оборачивает исходный массив с помощью интерфейса списка. Следовательно, изменения в массиве отражаются и на списке:

Integer[] array = new Integer[]; List list = Arrays.asList(array); array[0] = 10; // здесь list.get(0) == 10

Кроме того, список, возвращаемый Arrays.asList(), является изменяемым. То есть мы можем изменять отдельные элементы списка:

List list = Arrays.asList(1, 2, 3); list.set(1, 4); // здесь list.get(1) == 4

В конечном счете, это может привести к нежелательным побочным эффектам, вызывающим ошибки, которые трудно обнаружить. Когда массив передается в качестве входных данных, изменение в списке также будет отражено и в массиве:

Integer[] array = new Integer[]; List list = Arrays.asList(array); list.set(0, 5); // здесь array[0] == 5

Давайте теперь посмотрим на другой способ создания списков.

Использование List.of()

В отличие от Arrays.asList(), Java 9 представила более удобный метод List.of(). Этот метод создает экземпляры неизменяемых списков:

String[] array = new String[]; List list = List.of(array);

Отличия от Arrays.asList()

Основное отличие заключается в том, что List.of() возвращает неизменяемый список, который является копией входного массива. По этой причине изменения в исходном массиве не отражаются в возвращаемом списке:

String[] array = new String[]; List list = List.of(array); array[0] = "С++"; // здесь list.get(0) == "Java"

Кроме того, мы не можем изменять элементы списка. Если мы попытаемся это сделать, возникнет исключение UnsupportedOperationException:

String[] array = new String[]; List list = List.of(array); list.set(1, "C++"); // Exception in thread "main" java.lang.UnsupportedOperationException

Также нужно отметить, что List.of() не допускает значений null в качестве входных данных и вызовет исключение NullPointerException:

List.of("Hello", null, "World") // Exception in thread "main" java.lang.NullPointerException

Заключение

В этой короткой статье мы рассмотрели создание списков в Java с использованием List.of() и Arrays.asList() и отличия в этих методах.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *