¿Cómo funciona la clasificación con Java 8 Stream debajo del capó?

10

Cuando llamo, Stream.sort(..)¿hay una nueva matriz de elementos creados y la secuencia itera sobre la matriz ordenada recién creada?

En otras palabras, ¿cómo funciona Java 8 Stream sortbajo el capó?

InformadoA
fuente
¿Por qué obtengo un voto negativo con esta pregunta?
InformadoA
2
Su pregunta es razonable y no merece votos negativos. Sus comentarios sobre la respuesta de amon , sin embargo ... ugh: |
Andres F.
@AndresF. El voto negativo llegó incluso antes de que hiciera ese comentario. Es una de las razones por las que estaba muy molesto.
InformadoA
Los comentarios no son motivo de voto negativo, de todos modos. La pregunta se basa en su propio mérito, y es válida en mi opinión. Yo lo voté.
Andres F.

Respuestas:

10

Puede usar grepcode.com para buscar a través del código de la biblioteca estándar de Java (y algunas otras bibliotecas). Desafortunadamente, el código de implementación del flujo es bastante abstracto. Un buen punto de partida es la java.util.stream.SortedOpsclase interna que transforma una secuencia en una secuencia ordenada.

La implementación actual (utilizada para flujos de contenedores de biblioteca estándar) lo convierte en un no-op si el flujo ya está ordenado, usa una matriz si se conoce el tamaño del flujo ( SizedRefSortingSink) o acumula todos los elementos en una ArrayList si el tamaño es desconocido ( RefSortingSink).

Por supuesto, dichos detalles de implementación pueden cambiar con cualquier versión, pero las consideraciones fundamentales son universales: la clasificación de una secuencia es necesariamente una operación entusiasta / de bloqueo, y la clasificación de una secuencia infinita no tiene sentido. Esto significa que ordenar una secuencia no es útil si usa secuencias porque pueden ser diferidas, pero aún así obtiene la sintaxis de secuencia conveniente.

Otros flujos tendrán que proporcionar su propia implementación de Stream.sorted(), que probablemente será similar.

amon
fuente
1
@InformadoA No quiero sugerir que las lambdas o los arroyos sean una "mierda bajo el capó". Ambos son increíblemente convenientes, a pesar de que los detalles con respecto a las secuencias son inusualmente complejos en comparación con otros conceptos de Java. Si desea mantener su noción preconcebida de que estas herramientas son inútiles o dañinas, se está limitando innecesariamente.
amon
1
@amon: de acuerdo, las transmisiones adicionales brindan la posibilidad de implementar implementaciones paralelas multinúcleo bajo el capó, sin cambiar virtualmente la aplicación. Y la complejidad de la implementación del flujo proviene exactamente de eso. Eso es mucho más que solo conveniencia, es la abstracción correcta. Para el OP: le sugiero que lea Mastering Lambdas ... si desea comprender por qué las lambdas y las transmisiones son mucho más que características convenientes.
Yuri Steinschreiber
3
@InformedA: las lambdas han existido durante 80 años y existen en casi todos los lenguajes de programación actuales. Las transmisiones han existido durante 40 años, y también existen en casi todos los marcos de colecciones principales. Podrían llamarse cosas diferentes (iteradores, listas perezosas, enumeradores, enumerables), pero están ahí. Lambdas y listas perezosas son algunas de las abstracciones más antiguas y estables que existen, y han sobrevivido a cada nueva moda, bombo, paradigma, movimiento, metodología, tecnología, lenguaje, sistema operativo, marco, biblioteca que se les arroja. Eso los hace valer la pena.
Jörg W Mittag
2
@InformedA Java, el lenguaje de programación, es solo una abstracción de código de bytes que se ejecuta en la JVM. La JVM en sí misma es solo una abstracción de mierda escrita en C (o C ++, lo olvido). C y C ++ son solo abstracciones de mierda sobre el lenguaje ensamblador. Incluso el lenguaje ensamblador en sí mismo es una abstracción de mierda sobre microcódigo, que también es una abstracción de mierda sobre circuitos (bueno, podría estar perdiendo algunos pasos intermedios). Se podría decir que todo lo útil en el software es una "abstracción de mierda" sobre otra cosa.
Andres F.
3
@InformedA Mi consejo sincero es que intente aprender un lenguaje que esté más orientado a la programación funcional que Java. Incluso si nunca lo usa para su trabajo diario, obtendrá una comprensión de los lenguajes de programación y sus opciones de diseño que lo ayudarán con Java :)
Andres F.