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

205
Vistas
¿Cuál es la diferencia entre Stream.of e IntStream.range?

Por favor, considere este código:

 System.out.println("#1"); Stream.of(0, 1, 2, 3) .peek(e -> System.out.println(e)) .sorted() .findFirst(); System.out.println("\n#2"); IntStream.range(0, 4) .peek(e -> System.out.println(e)) .sorted() .findFirst();

La salida será:

 #1 0 1 2 3 #2 0

¿Alguien podría explicar por qué la salida de dos flujos es diferente?

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

0

Bueno, IntStream.range() devuelve a sequential ordered IntStream from startInclusive(inclusive) to endExclusive (exclusive) by an incremental step of 1 , lo que significa que ya está ordenado. Dado que ya está ordenado, tiene sentido que la siguiente operación intermedia .sorted() no haga nada. Como resultado, peek() se ejecuta solo en el primer elemento (ya que la operación de terminal solo requiere el primer elemento).

Por otro lado, los elementos pasados a Stream.of() no están necesariamente ordenados (y el método of() no verifica si están ordenados). Por lo tanto, .sorted() debe atravesar todos los elementos para producir un flujo ordenado, lo que permite que la operación de terminal findFirst() devuelva el primer elemento del flujo ordenado. Como resultado, peek se ejecuta en todos los elementos, aunque la operación de terminal solo necesita el primer elemento.

over 4 years ago · Santiago Trujillo Denunciar

0

IntStream.range ya está ordenado:

 // reports true System.out.println( IntStream.range(0, 4) .spliterator() .hasCharacteristics(Spliterator.SORTED) );

Entonces, cuando se activa el método sorted() en Stream, internamente, se convertirá en NO-OP .

De lo contrario, como ya vio en su primer ejemplo, todos los elementos deben ordenarse, solo entonces findFirst puede decir quién es "realmente el primero".

Solo tenga en cuenta que esta optimización solo funciona para secuencias ordenadas de forma natural. Por ejemplo:

 // prints too much you say? Stream.of(new User(30), new User(25), new User(34)) .peek(x -> System.out.println("1 : before I call first sorted")) .sorted(Comparator.comparing(User::age)) .peek(x -> System.out.println("2 : before I call second sorted")) .sorted(Comparator.comparing(User::age)) .findFirst();

donde (por brevedad):

 record User(int age) { }
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