chepe lucho :
class EntityCompositeId {
private Long firstId;
private Long secondId;
// getter & setter...
}
class EntityComposite {
private EntityCompositeId id;
private String first;
private String second;
// getter & setter...
}
List<EntityComposite> listEntityComposite = ....
Supose this content
1, 1, "firstA", "secondBirdOne"
1, 2, "firstA", "secondBirdTwo"
1, 3, "firstA", "secondBirdThree"
2, 1, "firstB", "secondCatOne"
2, 2, "firstB", "secondCatTwo"
2, 3, "firstB", "secondCatThree"
3, 1, "firstC", "secondDogOne"
3, 2, "firstC", "secondDogTwo"
3, 3, "firstC", "secondDogThree"
Map<Long, List<String>> listOfLists = new HashMap<>();
Ahora, utilizando corriente Quiero llenar como:
1 -> {"secondBirdOne", "secondBirdTwo", "secondBirdThree"}
2 -> {"secondCatOne", "secondCatTwo", "secondCatThree"}
3 -> {"secondDogOne", "secondDogTwo", "secondDogThree"}
Mi INACABADA (esa es la pregunta) código es:
listEntityComposite.stream()forEach(entityComposite {
// How create a list according entityComposite.getId.getFirstId()?
listOfLists.put(entityComposite.getId.getFirstId(), .... )
});
Ousmane D .:
Existen varios enfoques diferentes en las que usted puede lograr la tarea en cuestión.
forEach + computeIfAbsent
Map<Long, List<String>> map = new HashMap<>();
listEntityComposite.forEach(e -> map.computeIfAbsent(e.getId().getFirstId(),
k -> new ArrayList<>()).add(e.getSecond()));
- enumera más de los elementos de
listEntityComposite
víaforEach
- para cada elemento utiliza
computeIfAbsent
para calcular la clave (es decir,firstId
) y el valor (es decirList<String>
)
groupingBy + mapeo
Otro enfoque sería aplicar una groupingBy
con un mapping
colector de aguas abajo:
Map<Long, List<String>> resultSet = listEntityComposite.stream()
.collect(groupingBy(e -> e.getId().getFirstId(),
mapping(EntityComposite::getSecond, toList())));
- grupos de los elementos de la fuente de la función de clasificación
e.getId().getFirstId()
y luego aplica unmapping
colector aguas abajo para refinar aún más nuestra consulta.
forEach + fusión
listEntityComposite.forEach(e -> map.merge(e.getId().getFirstId(),
new ArrayList<>(singletonList(e.getSecond())),
(l, r) -> {l.addAll(r); return l;}));
enumera más de los elementos de
listEntityComposite
víaforEach
para cada elemento utiliza
merge
para calcular la clave (es decir,firstId
) y el valor (es decirList<String>
)
para asignar
listEntityComposite.stream()
.collect(toMap(e -> e.getId().getFirstId(),
v -> new ArrayList<>(singletonList(v.getSecond())),
(l, r) -> {l.addAll(r); return l;}));
- se aplica una
keyMapper
funcióne -> e.getId().getFirstId()
para extraer las claves de mapas. - se aplica una
valueMapper
funciónv -> new ArrayList<>(singletonList(v.getSecond()))
para extraer los valores de mapa. - se aplica una
merge
función(l, r) -> {l.addAll(r); return l;}
a las colisiones clave determinación.
Para concluir, el forEach
+ computeIfAbsent
aproximación y el groupingBy
+ mapping
enfoque son los dos que debe favorecer en este caso específico, ya que son más idiomática.