Trillian:
Tengo una lista de artículos que cada elemento puede pertenecer a una o más categorías. Para un conjunto limitado de categorías (cadena) Quiero crear un mapa con la categoría como la clave y la lista de artículos como valor.
Asumir se define mi clase de artículos, como se muestra a continuación:
public static class Item{
long id;
List<String> belongsToCategories;
public List<String> getBelongsToCategories() {
return belongsToCategories;
}
public void setBelongsToCategories(List<String> belongsToCategories) {
this.belongsToCategories = belongsToCategories;
}
public Item(long id,List<String> belongsToCategories) {
this.id = id;
this.belongsToCategories = belongsToCategories;
}
@Override
public String toString() {
return "Item{" + "id=" + id + '}';
}
}
y una lista de artículos:
public static void main(String[] args) {
List<Item> myItemList = new ArrayList<>();
myItemList.add(new Item(1,Arrays.asList("A","B")));
myItemList.add(new Item(2,Arrays.asList("A","C")));
myItemList.add(new Item(3,Arrays.asList("B","C")));
myItemList.add(new Item(4,Arrays.asList("D")));
myItemList.add(new Item(5,Arrays.asList("D","E")));
myItemList.add(new Item(6,Arrays.asList("A","F")));
Map<String,List<Item>> myMap= new HashMap<>();
¿Cómo puedo llenar myMap de miLista?
Pensé corriente API podría ayudar, pero no sé cual clasificador para poner en el método groupingBy cuando un elemento puede pertenecer a una o más categorías
myItemList.stream().collect(Collectors.groupingBy(classifier));
Esta
myItemList.stream().collect(Collectors.groupingBy(Item::getBelongsToCategories));
produce
[D, E]=[Item{id=5}]
[B, C]=[Item{id=3}]
[A, B]=[Item{id=1}]
[D]=[Item{id=4}]
[A, C]=[Item{id=2}]
[A, F]=[Item{id=6}]
espera es dura algo así como:
A=[Item{id=1}, Item{id=2}, Item{id=6}]
B=[Item{id=1}, Item{id=3}]
C=[Item{id=2}, Item{id=3}]
D=[Item{id=4}, Item{id=5}]
E=[Item{id=5}]
F=[Item{id=6}]
también:
Se puede utilizar flatMap
para asignar a SimpleEntry
y luego groupingBy
como:
return items.stream()
.flatMap(p -> p.getBelongsToCategories()
.stream()
.map(l -> new AbstractMap.SimpleEntry<>(l, p)))
.collect(Collectors.groupingBy(Map.Entry::getKey,
Collectors.mapping(Map.Entry::getValue,
Collectors.toList())));