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

¡Ninguna de las opciones es correcta! El problema está en que el enunciado pide dos cosas contradictorias:

Ninguna de las opciones es correcta El problema está en que el enunciado pide dos cosas contradictorias:
-Encontrar la primera transacción (findFirst())
-Recolectar todas en un Set (collect(Collectors.toSet()))

Estos son objetivos mutuamente excluyentes. findFirst() es terminal y devuelve un único elemento (Optional), mientras que collect(Collectors.toSet()) recolecta todos los elementos filtrados.
Para hacer ambas cosas, hay que hacer las dos operaciones separadas:

// Para recolectar TODAS en un Set
Set<Transaccion> transaccionesFiltradas = transacciones.stream()
    .filter(t -> t.getValor() > 5000)
    .peek(System.out::println)
    .collect(Collectors.toSet());

// Para encontrar la PRIMERA
Optional<Transaccion> primera = transacciones.stream()
    .filter(t -> t.getValor() > 5000)
    .findFirst();
1 respuesta

Hola Lucio, espero que estés bien

Entiendo la confusión que tienes con el enunciado de la actividad. Parece que el ejercicio está diseñado para que practiques diferentes operaciones de la API de Streams en Java, pero la forma en que está planteado puede parecer contradictoria.

La clave aquí es entender que findFirst() y collect(Collectors.toSet()) no pueden ser parte del mismo flujo de operaciones, ya que findFirst() es una operación terminal que devuelve un Optional y detiene el flujo. Por otro lado, collect(Collectors.toSet()) también es una operación terminal que recolecta todos los elementos en un Set.

Para cumplir con los requisitos del ejercicio, necesitas realizar las operaciones por separado, como lo has mencionado. Primero, puedes recolectar todas las transacciones que cumplen con el filtro en un Set, y luego, si lo deseas, puedes buscar la primera de estas transacciones en el Set resultante. Aquí tienes un ejemplo de cómo podrías hacerlo:

// Para recolectar TODAS en un Set
Set<Transaccion> transaccionesFiltradas = transacciones.stream()
    .filter(t -> t.getValor() > 5000)
    .peek(System.out::println)
    .collect(Collectors.toSet());

// Para encontrar la PRIMERA
Optional<Transaccion> primera = transaccionesFiltradas.stream()
    .findFirst();

Espero que esto aclare tu duda y te ayude a entender cómo manejar este tipo de situaciones en el futuro. ¡Espero haber ayudado y buenos estudios!