es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo agrupar Stream en Stream>, y no en Map>?

Tengo una clase POJO:
java
@Data
@AllArgsConstructor
public class Person {
private String name;
private String surname;
}

Tengo un código ejecutable:

public class Main {

public static void main(String[] args) {
    Person john1 = new Person("John", "Smith");
    Person john2 = new Person("John", "Brown");
    Person nancy1 = new Person("Nancy", "James");
    Person nancy2 = new Person("Nancy", "Williams");
    Person kate1 = new Person("Kate", "Fletcher");

    List<person> persons = List.of(john1, kate1, john2, nancy1, nancy2);
    Stream<><person>> result = persons.stream().collect(Collectors.groupingBy(Person::getName)).values().stream();
    System.out.println(result);
}
}

¿Cómo puedo obtener Stream<List<Person>> en lugar de Map<String, List<Person>> en result? y no necesito claves. ¿Puedo obtenerlo sin usar una colección Map?

ACTUALIZACIÓN: Hay personas con el mismo nombre en cada lista.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para obtener un Stream<><person>> en lugar de un Map<string,></string,><person>> utilizando el recolector groupingBy, puede utilizar el recolector secundario Collectors.mapping junto con Collectors.toList(). Esto agrupará los objetos Person por nombre y luego mapeará cada grupo a una lista de objetos Person.

    List<><person>> result = persons.stream()
        .collect(Collectors.groupingBy(
            Person::getName,
            Collectors.mapping(
                Function.identity(),
                Collectors.toList()
            )
        ))
        .values().stream()
        .collect(Collectors.toList());
    System.out.println(result);
    

    El código anterior dará como resultado la salida deseada de Stream<><person>> sin claves. Como el resultado ya está en el formato deseado, no es necesario utilizar una colección de mapa.

Comments are closed.