Сделали этот ответ с обновленным подходом с JDK-11, представляющим новый не менее производительный API toArray(T[])и похожий по синтаксису Stream.toArray.
Наман
Ответы:
1792
List<String> list =..;String[] array = list.toArray(newString[0]);
Например:
List<String> list =newArrayList<String>();//add some stuff
list.add("android");
list.add("apple");String[] stringArray = list.toArray(newString[0]);
toArray()Метод без передачи каких - либо аргументы возвращаются Object[]. Таким образом, вы должны передать массив в качестве аргумента, который будет заполнен данными из списка и возвращен. Вы также можете передать пустой массив, но вы также можете передать массив с желаемым размером.
Важное обновление : изначально код выше использовался new String[list.size()]. Тем не менее, этот пост показывает, что благодаря оптимизации JVM использование new String[0]стало лучше.
Оказывается, что предоставление массива нулевой длины, даже его создание и удаление, в среднем быстрее, чем выделение массива правильного размера. Ориентиры и объяснения см. Здесь: shipilev.net/blog/2016/arrays-wisdom-ancients
Стюарт Маркс
2
(Извините. Риторический вопрос. Ответ, конечно, потому что Java не делает настоящие дженерики; она в основном просто подделывает их, используя Object)
Nyerguds
3
@lyuboslavkanev Проблема в том, что наличия универсального типа в Java недостаточно для создания объектов на основе этого типа; даже не массив (что смешно, потому что это должно работать для любого типа). Насколько я могу видеть, все, что можно сделать, это кастинг. На самом деле, даже для создания объектов типа вам необходим фактический Classобъект, который, по-видимому, совершенно невозможно извлечь из универсального типа. Причина этого, как я уже сказал, в том, что вся конструкция является поддельной; все это просто хранится как объект внутри.
Я бы предпочел этот синтаксис, но IntelliJ отображает ошибку компилятора, жалуется, что «T [] не является функциональным интерфейсом».
Глен Мазза
3
@GlenMazza вы можете использовать только toArrayна Streamобъекте. Эта ошибка компиляции может возникнуть, если вы уменьшите поток с помощью, Collectorsа затем попытаетесь применить toArray.
Удара Бентота
39
Вы можете использовать toArray()метод для List:
ArrayList<String> list =newArrayList<String>();
list.add("apple");
list.add("banana");String[] array = list.toArray(newString[list.size()]);
Или вы можете вручную добавить элементы в массив:
ArrayList<String> list =newArrayList<String>();
list.add("apple");
list.add("banana");String[] array =newString[list.size()];for(int i =0; i < list.size(); i++){
array[i]= list.get(i);}
List<String> list =List.of("x","y","z");String[] arrayBeforeJDK11 = list.toArray(newString[0]);String[] arrayAfterJDK11 = list.toArray(String[]::new);// similar to Stream.toArray
Это работает, но не очень эффективно, и дублирует функциональность в принятом ответе с дополнительным кодом.
Алан Делимон
5
в случае, если требуется дополнительная манипуляция с данными, для которой пользователь хочет функцию, этот подход не идеален (поскольку требует передачи класса элемента в качестве второго параметра), но работает:
Если ваше приложение уже использует Apache Commons lib, вы можете немного изменить принятый ответ, чтобы каждый раз не создавать новый пустой массив:
List<String> list =..;String[] array = list.toArray(ArrayUtils.EMPTY_STRING_ARRAY);// or if using static importString[] array = list.toArray(EMPTY_STRING_ARRAY);
Есть еще несколько предварительно выделенных пустых массивов разных типов в ArrayUtils.
Также мы можем обмануть JVM, чтобы создать для нас пустой массив следующим образом:
String[] array = list.toArray(ArrayUtils.toArray());// or if using static importString[] array = list.toArray(toArray());
Но в этом нет никакого преимущества, просто вопрос вкуса, ИМО.
Я понизил голосование, потому что: 1. нет использования обобщений, которые вынуждают вас использовать 2. .toString()где нет необходимости в явном приведении, 3. вы даже не увеличиваете i, и 4. whileлучше заменить на a for. Предлагаемый код:ArrayList<String> stringList = ... ; String[] stringArray = new String[stringList.size()]; int i = 0; for(Iterator<String> it = stringList.iterator(); it.hasNext(); i++) { stringArray[i] = it.next(); }
Оливье Грегуар
Хорошо, я понял это сейчас. Спасибо.
Ватсал Чавда
Ну, в идеале, вы должны отредактировать свой код, чтобы включить эти комментарии (то есть ... если вы считаете, что они хороши для вашего ответа!). Я не буду рассматривать удаление моего downvote, пока код остается неизменным.
Оливье Грегуар
Я новичок здесь, поэтому я еще не знаю, как здесь все работает. Хотя, ценю вашу помощь, приятель.
Ватсал Чавда
Это намного лучше! Я немного отредактировал, но вы только что узнали, как это работает: предоставьте ответ, улучшите их, получите лавры;)
Оливье Грегуар
5
В Java 11 мы можем использовать Collection.toArray(generator)метод. Следующий код создаст новый массив строк:
List<String> list =List.of("one","two","three");String[] array = list.toArray(String[]::new)
List<String> list =newArrayList<>();
list.add("a");
list.add("b");
list.add("c");String[] strArry= list.stream().toArray(size ->newString[size]);
В комментариях я добавил параграф, чтобы объяснить, как работает конвертация. Сначала List преобразуется в поток String. Затем он использует Stream.toArray для преобразования элементов в потоке в массив. В последнем выражении выше «size -> new String [size]» на самом деле является функцией IntFunction, которая выделяет массив String с размером потока String. Утверждение идентично
toArray(T[])
и похожий по синтаксисуStream.toArray
.Ответы:
Например:
toArray()
Метод без передачи каких - либо аргументы возвращаютсяObject[]
. Таким образом, вы должны передать массив в качестве аргумента, который будет заполнен данными из списка и возвращен. Вы также можете передать пустой массив, но вы также можете передать массив с желаемым размером.Важное обновление : изначально код выше использовался
new String[list.size()]
. Тем не менее, этот пост показывает, что благодаря оптимизации JVM использованиеnew String[0]
стало лучше.источник
Class
объект, который, по-видимому, совершенно невозможно извлечь из универсального типа. Причина этого, как я уже сказал, в том, что вся конструкция является поддельной; все это просто хранится как объект внутри.Альтернатива в Java 8:
Java 11+:
источник
toArray
наStream
объекте. Эта ошибка компиляции может возникнуть, если вы уменьшите поток с помощью,Collectors
а затем попытаетесь применитьtoArray
.Вы можете использовать
toArray()
метод дляList
:Или вы можете вручную добавить элементы в массив:
Надеюсь это поможет!
источник
Используя copyOf, ArrayList для массивов может быть сделано также.
источник
Начиная с Java-11, можно альтернативно использовать API
Collection.toArray(IntFunction<T[]> generator)
для достижения того же, что и:источник
В Java 8:
источник
parallelStream()
вместо простоstream()
?В Java 8 это можно сделать с помощью
источник
Универсальное решение, позволяющее скрыть любую
List<Type>
информациюString []
:Примечание Вы должны
override toString()
метод.источник
источник
в случае, если требуется дополнительная манипуляция с данными, для которой пользователь хочет функцию, этот подход не идеален (поскольку требует передачи класса элемента в качестве второго параметра), но работает:
import java.util.ArrayList; import java.lang.reflect.Array;
источник
Если ваше приложение уже использует Apache Commons lib, вы можете немного изменить принятый ответ, чтобы каждый раз не создавать новый пустой массив:
Есть еще несколько предварительно выделенных пустых массивов разных типов в
ArrayUtils
.Также мы можем обмануть JVM, чтобы создать для нас пустой массив следующим образом:
Но в этом нет никакого преимущества, просто вопрос вкуса, ИМО.
источник
Вы можете использовать
Iterator<String>
для итерации элементовArrayList<String>
:Теперь вы можете извлечь элементы из
String[]
любого цикла.источник
.toString()
где нет необходимости в явном приведении, 3. вы даже не увеличиваетеi
, и 4.while
лучше заменить на afor
. Предлагаемый код:ArrayList<String> stringList = ... ; String[] stringArray = new String[stringList.size()]; int i = 0; for(Iterator<String> it = stringList.iterator(); it.hasNext(); i++) { stringArray[i] = it.next(); }
В Java 11 мы можем использовать
Collection.toArray(generator)
метод. Следующий код создаст новый массив строк:из java.base
java.util.Collection.toArray()
.источник
В комментариях я добавил параграф, чтобы объяснить, как работает конвертация. Сначала List преобразуется в поток String. Затем он использует Stream.toArray для преобразования элементов в потоке в массив. В последнем выражении выше «size -> new String [size]» на самом деле является функцией IntFunction, которая выделяет массив String с размером потока String. Утверждение идентично
источник
Вы можете преобразовать список в массив строк, используя этот метод:
Полный пример:
источник
источник