Me gustaría construir un mapa utilizando la pareja de la secuencia y de Lambda.
He intentado muchas maneras, pero estoy Stucked. Aquí está el código de Java clásica de hacerlo utilizando tanto Corriente / Lambda y bucles clásicos.
Map<Entity, List<Funder>> initMap = new HashMap<>();
List<Entity> entities = pprsToBeApproved.stream()
.map(fr -> fr.getBuyerIdentification().getBuyer().getEntity())
.distinct()
.collect(Collectors.toList());
for(Entity entity : entities) {
List<Funder> funders = pprsToBeApproved.stream()
.filter(fr -> fr.getBuyerIdentification().getBuyer().getEntity().equals(entity))
.map(fr -> fr.getDocuments().get(0).getFunder())
.distinct()
.collect(Collectors.toList());
initMap.put(entity, funders);
}
Como se puede ver, sólo sé cómo recopilar en una lista, pero yo no puedo hacer lo mismo con un mapa. Es por eso que tengo que transmitir mi lista de nuevo para construir una segunda lista que, finalmente, poner todo junto en un mapa. También he probado la declaración 'collect.groupingBy' como debe también producir un mapa, pero fallé.
Parece que desea asignar lo que está en la pprsToBeApproved
lista a sus Funder
instancias, agrupándolos por el comprador Entity
.
Puede hacerlo de la siguiente manera:
Map<Entity, List<Funder>> initMap = pprsToBeApproved.stream()
.collect(Collectors.groupingBy(
fr -> fr.getBuyerIdentification().getBuyer().getEntity(), // group by this
Collectors.mapping(
fr -> fr.getDocuments().get(0).getFunder(), // mapping each element to this
Collectors.toList()))); // and putting them in a list
Si no desea que los donantes duplicados para una entidad en particular, puede obtener un mapa de conjuntos en su lugar:
Map<Entity, Set<Funder>> initMap = pprsToBeApproved.stream()
.collect(Collectors.groupingBy(
fr -> fr.getBuyerIdentification().getBuyer().getEntity(),
Collectors.mapping(
fr -> fr.getDocuments().get(0).getFunder(),
Collectors.toSet())));
Esto utiliza Collectors.groupingBy
junto con Collectors.mapping
.