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 Bar
tiene un constructor con 1 parámetro de tipo, Foo
es decir public Bar(Foo foo){ ... }
?
java
arrays
collections
transformation
romano
fuente
fuente
Stream.toArray
API existente del JDK.Respuestas:
¿Dónde
x
está 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.toArray
crear 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
toArray
mé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
const
no es Java!public static final Foo[] FOO = {}
import static
para 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
null
valores, 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
toArray
método).fuente
new Bar[0]
evita el problemaPor ejemplo, tiene una colección ArrayList con elementos Clase de estudiante:
fuente