Предположим, у нас есть файл Collection<Foo>
. Каков наилучший (самый короткий в LoC в текущем контексте) способ преобразовать его вFoo[]
? Допускаются любые известные библиотеки.
UPD: (еще один случай в этом разделе; оставьте комментарии, если считаете, что для него стоит создать еще один поток): Как насчет преобразования Collection<Foo>
в Bar[]
where Bar
has конструктор с 1 параметром типа, Foo
т.е. public Bar(Foo foo){ ... }
?
java
arrays
collections
transformation
Римский
источник
источник
Stream.toArray
API от JDK.Ответы:
Где
x
коллекция:источник
x.toArray(new Foo[0])
--- документация : некогда читать ...(new Foo[0])
. Согласно документации Collection.toArray, `@param a массив, в котором должны храниться элементы этой коллекции, если он достаточно большой`, что означает, что он будет хранить их непосредственно в этом новом массиве. Если вы дадите ему массив размера 0, он создаст новый массив, что означает, что у вас есть небольшой массив и большой массив, который создается, когда в этом нет необходимости.toArray
создания целевого массива правильного типа. И в этом случае, честно говоря, мне было бы наплевать на один лишний пустой массив в моем приложении. Это намного ниже уровня шума.new Foo[0]
проще «но не лучшее (память)» ... то есть я имел в виду, что мое решение проще, но не лучшее (вот почему я использовал:
).new Foo[0]
Вариант , предложенный Карлос не страдает от этой проблемы.Альтернативное решение обновленного вопроса с использованием Java 8:
источник
Bar[] result = foos.stream().map(Bar::new).toArray(Bar[]::new);
Если вы используете его более одного раза или в цикле, вы можете определить константу
и сделайте преобразование как
toArray
Метод будет принимать пустой массив , чтобы определить правильный тип целевого массива и создать новый массив для вас.Вот мое предложение по обновлению:
источник
const
это не ява!public static final Foo[] FOO = {}
import static
для их получения.В JDK / 11 альтернативный способ преобразования a
Collection<Foo>
в anFoo[]
может заключаться в использованииCollection.toArray(IntFunction<T[]> generator)
as:Как объяснил @Stuart в списке рассылки (выделено мной), производительность этого должна быть по существу такой же, как у существующей
Collection.toArray(new T[0])
-Реализация API в JDK гласит:
Примечание : - Просто следует руководствоваться использованием API вместе с обратной несовместимостью при использовании для кода со
null
значениями, например,toArray(null)
поскольку эти вызовы теперь будут неоднозначными из-за наличияtoArray(T[] a)
и не смогут компилироваться.источник
Если вы используете Guava в своем проекте, вы можете использовать
Iterables::toArray
.источник
Для оригинала см. Двойной ответ:
Что касается обновления:
источник
Вот окончательное решение для случая в разделе обновлений (с помощью Google Collections):
Но ключевой подход здесь был упомянут в ответе doublep (я забыл о
toArray
методе).источник
new Bar[0]
позволяет избежать проблемы.Например, у вас есть коллекция ArrayList с элементами Student class:
источник