Java to array with type

Java: Convert Stream to Array

In this tutorial, we’ll be converting a Java Stream into a Java Array for primitive types, as well as objects.

Stream.toArray()

The toArray() method is a built-in method from the Stream class which is really convenient to use when converting from a Stream to an array. It works for both primitive types and objects, though, there’s a slight difference in the usage.

The method returns a new array, which means that we’ll be packing the results into a new array for storage. For objects, we’ll have to specify the object type and provide an array constructor of that type to the method as well.

Primitive Types

Java 8 has special streams for primitive types, i.e., IntStream , LongStream and DoubleStream . Let’s use an IntStream to store a range of integers, and then convert it into an array:

IntStream stream = IntStream.range(10, 20); int[] array = stream.toArray(); System.out.println("Printing array . "); for (int i = 0; i < array.length; ++i) System.out.print(array[i] + " "); 
Printing array . 10 11 12 13 14 15 16 17 18 19 

Streams are handy for data manipulation, so you might want to do preprocessing on a stream, rather than an array, and convert it into one in the end:

IntStream stream = IntStream.range(10, 20); // Filter out all even numbers int[] array = stream.filter(x -> x%2 == 0).toArray(); System.out.println("\nPrinting even numbers . "); for (int i = 0; i < array.length; ++i) System.out.print(array[i] + " "); 
Printing even numbers . 10 12 14 16 18 

Objects

For objects, the toArray() method takes in an array constructor reference for the respective object, and returns an array of that type. Let’s make a Stream of String objects and convert it into an array:

// Create a List of Strings List list = new ArrayList<>(); list.add("John"); list.add("Jenny"); list.add("Martha"); // Stream the List Stream stream = list.stream(); // Create an array using the toArray() method String[] array = stream.toArray(String[]::new); System.out.println("Printing String array . "); for (int i = 0; i < array.length; ++i) System.out.println(array[i]); 
Printing String array. John Jenny Martha 

Note: The toArray() method requires the array constructor to be used and we've used a method reference to specify the type - String[]::new . toArray() returns an array of the specified type, and if the type isn't specified, a mismatch will occur:

String[] array = stream.toArray(); 

Free eBook: Git Essentials

Check out our hands-on, practical guide to learning Git, with best-practices, industry-accepted standards, and included cheat sheet. Stop Googling Git commands and actually learn it!

Читайте также:  Php show all notices

The result is a compiler error:

error: incompatible types: Object[] cannot be converted to String[] 

Instead of the shorthand method references, we can also use Lambda Expressions to achieve this. Let's filter out only names that start with 'J':

// Create a List of Strings List list = new ArrayList<>(); list.add("John"); list.add("Jenny"); list.add("Martha"); // Stream the List Stream stream = list.stream(); // Filter the stream element and convert to array String[] array = stream .filter(string -> string.startsWith("J")) .toArray(size -> new String[size]); System.out.println("Printing names starting with 'J'. "); for (int i = 0; i < array.length; ++i) System.out.println(array[i]); 
Printing names starting with 'J'. John Jenny 

Conclusion

In this article, we've converted a Stream into an array. This can be done for primitive and object arrays via the Stream.toArray() method, albeit, with slightly different usage.

Источник

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. Создаем цикл со счетчиком, чтобы пробежаться по всем элементам списка и иметь возможность обращаться к ячейкам массива по индексу:

Шаг 3. Внутри цикла значение каждого элемента списка с индексом i присваиваем ячейке массива с индексом 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); >> > 
 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); >> > 
 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); >> > 
 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 предоставляет более функциональный подход для решения подобных задач.

Итоги

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

В данной статье мы рассмотрели различные способы приведения списков к массивам:

  • простой перебор;
  • метод toArray;
  • Stream API.

Самый оптимальный вариант — использовать метод toArray , который определен в интерфейсе List . Таких методов два:

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

Первый не принимает аргументы, но возвращает массив объектов, из-за чего чаще всего придется прибегать к явному приведению типов. Второй возвращает массив нужного типа, но в качестве аргумента принимает массив. Лучше всего передавать пустой массив в метод, и будет вам счастье. Использование Stream API позволяет не только привести список к массиву, но и попутно провести некоторые действия, например отфильтровать или преобразовать элементы, перед добавлением их в массив.

Домашка

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

Источник

Оцените статью