Supongamos que tenemos a Collection<Foo>. ¿Cuál es la mejor manera (la más corta en LoC en el contexto actual) para transformarlo Foo[]? Cualquier biblioteca conocida está permitida.
UPD: (un caso más en esta sección; deje comentarios si cree que vale la pena crear otro hilo para él): ¿Qué pasa con la transformación Collection<Foo>a Bar[]donde Bartiene un constructor con 1 parámetro de tipo, Fooes decir public Bar(Foo foo){ ... }?
                    
                        java
                                arrays
                                collections
                                transformation
                                
                    
                    
                        romano
fuente
                
                fuente

Stream.toArrayAPI existente del JDK.Respuestas:
¿Dónde
xestá la colección?fuente
x.toArray(new Foo[0])--- documentación : no hay tiempo para leer ...(new Foo[0]). Según la documentación de Collection.toArray, `@param a la matriz en la que se almacenarán los elementos de esta colección, si es lo suficientemente grande`, lo que significa que los almacenará directamente en esa nueva matriz. Si le da una matriz de tamaño 0, creará una nueva matriz, lo que significa que tendrá una matriz pequeña y una matriz grande cuando no sea necesario.toArraycrear una matriz de destino del tipo correcto. Y en este caso, sinceramente, no me importaría un solo conjunto vacío adicional en mi aplicación. Eso está muy por debajo del nivel de ruido.new Foo[0]es más simple "pero no la mejor (memoria)" ... es decir, mi solución es más fácil pero no la mejor (esa es la razón por la que lo usé:).new Foo[0]variante propuesta por Carlos no sufre este problema.Solución alternativa a la pregunta actualizada utilizando Java 8:
fuente
Bar[] result = foos.stream().map(Bar::new).toArray(Bar[]::new);Si lo usa más de una vez o en un bucle, podría definir una constante
y hacer la conversión como
El
toArraymétodo tomará la matriz vacía para determinar el tipo correcto de la matriz de destino y creará una nueva matriz para usted.Aquí está mi propuesta para la actualización:
fuente
constno es Java!public static final Foo[] FOO = {}import staticpara llegar a ellas.Con JDK / 11, una forma alternativa de convertir a
Collection<Foo>aFoo[]podría ser utilizarCollection.toArray(IntFunction<T[]> generator)como:Según lo explicado por @Stuart en la lista de correo (el énfasis es mío), el rendimiento de este debe ser esencialmente el mismo que el de la ya existente
Collection.toArray(new T[0])-La implementación de la API dentro del JDK dice:
Nota : - Solo que el uso de la API debe guiarse junto con una incompatibilidad hacia atrás cuando se usa para código con
nullvalores, por ejemplo,toArray(null)ya que estas llamadas ahora serían ambiguas debido a la existenciatoArray(T[] a)y no podrían compilarse.fuente
Si usa Guava en su proyecto, puede usar
Iterables::toArray.fuente
Para el original, vea la respuesta doublep :
En cuanto a la actualización:
fuente
Aquí está la solución final para el caso en la sección de actualización (con la ayuda de Google Collections):
Pero, el enfoque clave aquí se mencionó en la respuesta de doublep (olvidé el
toArraymétodo).fuente
new Bar[0]evita el problemaPor ejemplo, tiene una colección ArrayList con elementos Clase de estudiante:
fuente