Para decirlo de otra manera, ¿qué gano al usar Stream.Builder.add() para agregar elementos al generador y luego usar Stream.Builder.build() , en lugar de agregar los elementos en una colección o matriz y crear una secuencia a partir de eso? ?
Supongo que hay un beneficio en algún lugar en algunas circunstancias, pero no es obvio para mí...
Suponiendo que la máquina tiene suficiente memoria, el uso de Stream.Builder permite agregarle más elementos que Integer.MAX_VALUE .
Internamente, Stream.Builder usa un SpinedBuffer , que es una clase no pública.
De los documentos de SpinedBuffer :
Una colección ordenada de elementos. Los elementos se pueden agregar, pero no eliminar. Pasa por una fase de construcción, durante la cual se pueden agregar elementos, y una fase transversal, durante la cual los elementos se pueden atravesar en orden pero no es posible realizar más modificaciones.
Se utilizan una o más matrices para almacenar elementos. El uso de varias matrices tiene mejores características de rendimiento que una sola matriz utilizada por
ArrayList, ya que cuando es necesario aumentar la capacidad de la lista, no es necesario copiar los elementos. Esto suele ser beneficioso en el caso en que los resultados se recorrerán un pequeño número de veces.
Por lo tanto, también evita el cambio de tamaño de ArrayList .
Tiene una estructura de datos interna muy interesante que está altamente optimizada para inserciones, sin posibilidad de remoción o acceso aleatorio.
Su array y/o Collection pagan un precio adicional por todas las demás funciones que admiten.