我有以下代码:
public List<PolygonStat> groupItemsByTypeAndWeight(List<Item> items)
{
Map<Type, List<Item>> typeToItem = items
.stream()
.collect(
Collectors.groupingBy(
item -> item.type,
Collectors.toList()
)
);
// For some reason we want to make a distinction between weighted items within type
ArrayList<WeightedItem> weightedItems = new ArrayList<>();
typeToItem.forEach(
// List to list function
(type, items) -> weightedItems.addAll(createWeightedList(type, items))
);
return weightedItems;
}
我不太喜欢在这里创建
ArrayList<WeightedItem> weightedItems = new ArrayList<>();
的方式。是否有机会将其简化为一个return
运算符(即:return items.stream().(...).toList()
。我曾考虑过使用flatMap
,但forEach
对于.entrySet
应该返回void
。 最佳答案
您可以代替将中间结果保存到映射中,而只需从其entrySet创建一个新流。然后,通过使用map()
操作,可以将每个条目映射到新的WeightedItem
。
public List<PolygonStat> groupItemsByTypeAndWeight(List<Item> items){
return items.stream()
.collect(Collectors.groupingBy(item -> item.type))
.entrySet()
.stream()
.map(entry -> createdWeightedList(entry.getKey(), entry.getValue()))
.flatMap(Collection::stream)
.collect(Collectors.toList());
}