我可以内联这些流操作符序列吗?

时间:2018-06-04 14:22:23

标签: java java-stream

我有以下代码:

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()。我考虑使用flatMapforEach .entrySet应该返回{{} 1}}。

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