Suponha que temos um Collection<Foo>
. Qual é a melhor (mais curta no LoC no contexto atual) para transformá-lo Foo[]
? Quaisquer bibliotecas conhecidas são permitidas.
UPD: (mais um caso nesta seção; deixe comentários se você acha que vale a pena criar outro thread para ele): Que tal transformar Collection<Foo>
em Bar[]
onde Bar
tem construtor com 1 parâmetro do tipo Foo
ie public Bar(Foo foo){ ... }
?
java
arrays
collections
transformation
romano
fonte
fonte
Stream.toArray
API existente do JDK.Respostas:
Onde
x
está a coleção:fonte
x.toArray(new Foo[0])
--- documentação : não há tempo para ler ...(new Foo[0])
. De acordo com a documentação Collection.toArray, `@param a matriz na qual os elementos desta coleção devem ser armazenados, se forem grandes o suficiente`, o que significa que os armazenará diretamente nessa nova matriz. Se você fornecer uma matriz de tamanho 0, ela criará uma nova matriz, o que significa que você tem uma matriz pequena e uma matriz grande quando isso é desnecessário.toArray
criar uma matriz de destino do tipo correto. E, nesse caso, sinceramente, eu não me importaria com uma única matriz vazia extra no meu aplicativo. Isso está muito abaixo do nível de ruído.new Foo[0]
é mais simples "mas não é melhor (memória)" ... ou seja, eu quis dizer que minha solução é mais fácil, mas não é melhor (é por isso que eu usei:
).new Foo[0]
variante proposta por Carlos não sofre esse problema.Solução alternativa para a pergunta atualizada usando Java 8:
fonte
Bar[] result = foos.stream().map(Bar::new).toArray(Bar[]::new);
Se você o usar mais de uma vez ou em um loop, poderá definir uma constante
e faça a conversão como
O
toArray
método utilizará a matriz vazia para determinar o tipo correto da matriz de destino e criará uma nova matriz para você.Aqui está minha proposta para a atualização:
fonte
const
não é Java!public static final Foo[] FOO = {}
import static
para alcançá-las.Com o JDK / 11, uma maneira alternativa de converter um
Collection<Foo>
em umFoo[]
poderia ser usarCollection.toArray(IntFunction<T[]> generator)
como:Conforme explicado por @Stuart na lista de discussão (grifo meu), o desempenho disso deve ser essencialmente o mesmo do existente
Collection.toArray(new T[0])
-A implementação da API no JDK diz:
Nota : - Apenas o uso da API deve ser orientado juntamente com uma incompatibilidade reversa quando usado para código com
null
valores, por exemplo,toArray(null)
uma vez que essas chamadas agora seriam ambíguas por causa da existênciatoArray(T[] a)
e falhariam na compilação.fonte
Se você usa o Guava no seu projeto, pode usá-lo
Iterables::toArray
.fonte
Para o original, veja a resposta doublep :
Quanto à atualização:
fonte
Aqui está a solução final para o caso na seção de atualização (com a ajuda das coleções do Google):
Mas, a principal abordagem aqui foi mencionada na resposta do doublep (eu esqueci o
toArray
método).fonte
new Bar[0]
evita o problema.Por exemplo, você tem a coleção ArrayList com os elementos Student class:
fonte