Поток Java 8 - фильтр на вложенной карте и перестроение - PullRequest
0 голосов
/ 22 октября 2019

У меня есть вложенная карта в форме

TreeMap<LocalDate, Map<Long,TreeMap<BigDecimal,String>>>

, и мне нужно обработать эту карту и в итоге получить карту той же структуры, где вложенная карта дерева

TreeMap<BigDecimal, String>>

имеет ровно два элемента.

Я могу найти нужные элементы с помощью

values.entrySet().stream().flatMap(date -> date.getValue().entrySet().stream()
                                             .map(type -> type.getValue().entrySet()))
                                             .filter(valueMap -> valueMap.size() == 2 )

, но я не могу понять, как выразить .collect () для повторной сборки структуры. Любые указатели будут приветствоваться.

1 Ответ

0 голосов
/ 22 октября 2019

Вы теряете информацию при звонках flatMap и map. Вам необходимо сохранить ключи, чтобы иметь возможность перестроить вашу структуру.

С небольшим изменением вы можете просто отфильтровать внутренние карты и собрать их, используя внутренний поток, не влияя на структуру внешнего потока:

Map<LocalDate, Map<Long, TreeMap<BigDecimal, String>>> result = values.entrySet().stream()
        .collect(
                Collectors.toMap(
                        Entry::getKey,
                        entry -> entry.getValue()
                           .entrySet()
                           .stream()
                           .filter(subEntry -> subEntry.getValue().size() == 2)
                           .collect(Collectors.toMap(Entry::getKey,
                                 Entry::getValue)))
                        );
...