Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

286
Vistas
¿Cuándo una operación intermedia de Java golpea cada elemento?

Estoy confundido por la forma en que funcionan los flujos de Java, particularmente en lo que respecta a los cortocircuitos. Para un ejemplo de lo que me confunde, preparé el siguiente ejemplo:

 List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10); Optional<Integer> res = list.stream() .map(x -> { System.out.println("first map: " + x); return 2*x; }) .sorted((a,b)-> { System.out.println("sorting " + a + " : " + b); return a - b; }) .map(x -> { System.out.println("second map: " + x); return 2*x; }) .findAny(); System.out.println("found " + res.get());

con salida

 first map: 1 first map: 2 first map: 3 first map: 4 first map: 5 first map: 6 first map: 7 first map: 8 first map: 9 first map: 10 sorting 4 : 2 sorting 6 : 4 sorting 8 : 6 sorting 10 : 8 sorting 12 : 10 sorting 14 : 12 sorting 16 : 14 sorting 18 : 16 sorting 20 : 18 second map: 2 found 4

Cuando se ejecuta, este código demuestra que las llamadas sorted en el medio obligan a que el primer mapa se aplique a todos los elementos de la secuencia. Sin embargo, el segundo mapa no se aplica a todos los elementos de la secuencia ya que findAny lo cortocircuita.

Así que básicamente mi pregunta es: ¿cuáles son las reglas aquí? ¿Por qué Java es lo suficientemente inteligente como para saber que no necesita llamar al segundo mapa en cada elemento de la transmisión, pero no lo suficientemente inteligente como para saber que findAny al final no requiere que ordene nada?

Intenté "leer el manual" sobre esto, y simplemente no me queda claro.

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Eso sucede porque las secuencias procesan elementos de la fuente de forma perezosa, uno a la vez.

Cada operación ocurre solo cuando es necesaria.

En el caso de la clasificación, la transmisión vuelca todos los datos de la fuente a la memoria porque no hay forma de clasificar los elementos que miran a escondidas uno por uno.

 map --> sorted --> map --> findAny

La operación de asignación por primera vez se aplica a todos los elementos porque precede a la operación de clasificación .

Una vez realizada la clasificación , los elementos se procesarán de uno en uno.

La operación de terminal findAny es una operación de cortocircuito . Y, por lo tanto, solo el primero de todos los elementos será visto por la operación de terminal, la segunda operación de mapa debe aplicarse solo una vez.


¿Por qué Java es lo suficientemente inteligente como para saber que no necesita llamar al segundo mapa en cada elemento de la transmisión, pero no lo suficientemente inteligente como para saber que findAny al final no requiere que ordene nada?

Bueno, supongo que porque hasta ahora findAny() en el caso de ejecución de un solo subproceso todavía se comporta exactamente como findFirst() , que requerirá ordenar para encontrar el resultado correcto.

Puede intentar jugar con flujos secuenciales y descubrir que findAny() y findFirst() producen el mismo resultado.

No puedo darte la respuesta de por qué se comporta de esa manera.

Java-doc dice con precaución sobre findAny()

El comportamiento de esta operación es explícitamente no determinista.

Solo si el flujo se procesa en paralelo, el comportamiento de findAny() difiere de findFirst() .

findAny() podría devolver un elemento que es visto por cualquier subproceso, mientras que findFirst() garantiza respetar el orden inicial al proporcionar el resultado.


https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/stream/Stream.html

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda