Могу ли я встроить эти последовательности потоковых операторов? - PullRequest
0 голосов
/ 04 июня 2018

У меня есть следующий код:

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.

1 Ответ

0 голосов
/ 04 июня 2018

Вы можете вместо сохранения промежуточного результата на карте просто создать новый поток из его набора записей.И затем, используя операцию 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());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...