我有一个项目列表,其中每个项目可以属于一个或多个类别。对于有限的类别集(字符串),我希望创建一个以类别为键、以项目列表为值的Map。
假设我的Item类定义如下:
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 + '}';
}
}
以及项目列表:
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<>();
如何从myList填充myMap?
我认为API会有所帮助,但是当一个Item可以属于一个或多个类别时,我不知道在groupingBy方法中放置哪个分类器
myItemList.stream().collect(Collectors.groupingBy(classifier));
这个
myItemList.stream().collect(Collectors.groupingBy(Item::getBelongsToCategories));
生产
[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}]
预期是坚韧的,比如:
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}]
3条答案
按热度按时间aurhwmvo1#
您可以从Eclipse Collections使用
groupByEach
。输出:
您还可以将
Collectors2
实用程序类和groupByEach
收集器与JavaStream
一起使用。注意:我是Eclipse集合的提交者。
knsnq2tg2#
可以使用
flatMap
Map到SimpleEntry
,然后Map到groupingBy
,如下所示:5vf7fwbs3#
下面是
ListMultimap
的解决方案,可以来自Google Guava或我的库abacus-common我认为这样做会更有效和简洁一些,而不必通过
flatMap
创建不必要的临时Entry
对象。