我有以下代码:

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());
}

07-24 09:33