Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

185
Views
¿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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!