Con JDK / 11, una forma alternativa de convertir a Collection<Foo>
a Foo[]
podría ser utilizar Collection.toArray(IntFunction<T[]> generator)
como:
Foo[] foos = fooCollection.toArray(new Foo[0]); // before JDK 11
Foo[] updatedFoos = fooCollection.toArray(Foo[]::new); // after JDK 11
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])
-
El resultado es que las implementaciones que usan Arrays.copyOf(
) son las más rápidas, probablemente porque es intrínseca .
Puede evitar llenar con cero la matriz recién asignada porque sabe que se sobrescribirá todo el contenido de la matriz. Esto es cierto independientemente de cómo se vea la API pública.
La implementación de la API dentro del JDK dice:
default <T> T[] toArray(IntFunction<T[]> generator) {
return toArray(generator.apply(0));
}
La implementación predeterminada llama generator.apply(0)
para obtener una matriz de longitud cero y luego simplemente llama toArray(T[])
. Esto pasa por el Arrays.copyOf()
camino rápido, por lo que es esencialmente la misma velocidad que toArray(new T[0])
.
Nota : - Solo que el uso de la API debe guiarse junto con una incompatibilidad hacia atrás cuando se usa para código connull
valores, por ejemplo,toArray(null)
ya que estas llamadas ahora serían ambiguas debido a la existenciatoArray(T[] a)
y no podrían compilarse.
Stream.toArray
API existente del JDK.