我有以下代码:
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
应该返回{{} 1}}。
答案 0 :(得分:4)
您可以,而不是将中间结果保存到地图中,只需从其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());
}