Преобразование списка в массив в Java
В этом посте мы обсудим, как преобразовать список в массив в Java.
1. Использование List.toArray() метод
List интерфейс обеспечивает toArray() метод, возвращающий Object массив, содержащий элементы списка.
List
Object [ ] array = list . toArray ( ) ;
System . out . println ( Arrays . toString ( array ) ) ;
JVM не знает желаемого типа объекта, поэтому toArray() метод возвращает Object[] . Мы можем передать типизированный массив в перегруженный toArray(T[] a) чтобы сообщить JVM о желаемом типе объекта.
List
String [ ] array = list . toArray ( new String [ list . size ( ) ] ) ;
System . out . println ( Arrays . toString ( array ) ) ;
Мы также можем передать пустой массив (или массив любого размера) указанного типа, и JVM выделит необходимую память:
List
String [ ] array = list . toArray ( new String [ 0 ] ) ;
System . out . println ( Arrays . toString ( array ) ) ;
2. Использование Java 8
В Java 8 мы можем использовать Stream для преобразования списка в массив. Идея состоит в том, чтобы преобразовать данный список в поток, используя List.stream() метод и использует Stream.toArray() метод для возврата массива, содержащего элементы потока. Есть два способа сделать это:
⮚ Использование потоков со ссылкой на метод
List
String [ ] array = list . stream ( ) . toArray ( String [ ] :: new ) ;
System . out . println ( Arrays . toString ( array ) ) ;
⮚ Использование потоков с лямбда-выражением
List
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 преобразовать список элементов в массив элементов. Собственно, способов сделать это не так уж и много, и все они простые, так что статья будет несложной. Сразу же определимся, с чем мы работаем. Будем конвертировать списки в массивы, а конкретнее — список строк: 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
Иногда в 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() и отличия в этих методах.