Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
1
respuesta

Me esta imprimiendo dos veces

Por favor por que esta pasando esto

   episodios.stream()
             .filter(t -> t.getEvaluacion()> 9)
             .peek(System.out::println)
             .collect(Collectors.toSet()).stream()
             .findFirst()

Ingrese aquí la descripción de esta imagen para ayudar con la accesibilidad

1 respuesta

¡Hola Estudiante, espero que estés bien!

Desglose del código:

  1. episodios.stream(): Convierte la lista de episodios en un flujo para aplicar operaciones secuenciales.
  2. .filter(t -> t.getEvaluacion()> 9): Filtra los episodios con una evaluación mayor a 9.
  3. .peek(System.out::println): Imprime cada elemento que pasa el filtro. Aquí está la clave para entender la duplicación.
  4. .collect(Collectors.toSet()): Convierte el flujo en un conjunto (Set), eliminando duplicados.
  5. .stream(): Convierte nuevamente el conjunto en un flujo.
  6. .findFirst(): Obtiene el primer elemento del flujo.

¿Por qué se imprime dos veces?

  • Primer println: El método peek se ejecuta antes de la operación collect. Por lo tanto, cada episodio que cumple la condición se imprime una vez.
  • Segundo println: Aunque el conjunto eliminó los duplicados, el método findFirst() vuelve a convertir el conjunto en un flujo. Al imprimir el primer elemento de este nuevo flujo, se está imprimiendo nuevamente el elemento que ya se había impreso en el peek.

Solución:

Para evitar la repetición, puedes modificar el código de la siguiente manera:

Optional<Episodio> episodio = episodios.stream()
                                      .filter(t -> t.getEvaluacion()> 9)
                                      .collect(Collectors.toSet())
                                      .stream()
                                      .findFirst();

episodio.ifPresent(System.out::println);

Explicación:

  • Se almacena el resultado de findFirst() en una variable Optional<Episodio>.
  • Se utiliza ifPresent para imprimir el valor solo si está presente, evitando un NullPointerException en caso de que no se encuentre ningún episodio.

¿Por qué usar Optional?

  • Manejo de nulos: Evita errores de NullPointerException si no se encuentra ningún episodio.
  • Claridad: Indica explícitamente que el resultado puede estar ausente.

Consideraciones adicionales:

  • Optimización: Si estás seguro de que siempre habrá al menos un episodio que cumpla la condición, puedes omitir el Optional y usar get(). Sin embargo, esto introduce el riesgo de una excepción si no hay elementos.
  • Orden: Si el orden de los episodios es importante, considera usar Collectors.toList() en lugar de Collectors.toSet().
  • Otros métodos: Existen otros métodos como reduce, anyMatch, etc., que podrían ser más adecuados dependiendo de la lógica específica de tu aplicación.

En resumen, la repetición se producía debido a la combinación de peek y findFirst. Al almacenar el resultado en un Optional y usar ifPresent, se garantiza que el episodio se imprima solo una vez y se manejan correctamente los casos en los que no se encuentra ningún elemento.

¿Te gustaría explorar alguna otra parte del código o tienes alguna otra pregunta?

¡Espero haber ayudado y buenos estudios!