Использование Stream в Map'ах

138
06 июля 2019, 00:40

Помогите разобраться плиз.

Есть мапа Map: {params={par1=1, par2=name}}, значение тоже подразумевает тип Map.

Как можно при помощи stream конвертировать значение данной мапы в новую мапу, чтобы получилось {par1=1, par2=name} ?

попытался сделать что-то такое

Map<String, Object> parameters = params.entrySet().stream()
        .filter(k -> k.getKey().equals("params"))
        .collect(Collectors.toMap(Map.Entry::getKey, v -> v.getValue()));

Но все равно итог такой получаю {params={par1=1, par2=name}}

Пробовал продолжать, вызывая снова stream и добавляя map(String::split) например, не получается, в итоге не работает

Answer 1

Следите за тем, что находится в вашем стриме. После filter у вас всё ещё стрим, состоящий из Map.Entry исходного Map'а. Чтобы перейти к стриму из элементов вложенного Map'а, нужно его извлечь:

Map<String, Object> parameters = params.entrySet().stream()
        // Сейчас в стриме [Map.Entry(key=params, value={par1=1, par2=name})]
        .filter(k -> k.getKey().equals("params"))
        // В стриме всё ещё [Map.Entry(key=params, value={par1=1, par2=name})]
        .map(Map.Entry::getValue)
        // Сейчас в стриме [Map {par1=1, par2=name}]
        .flatMap(m -> m.entrySet().stream())
        // А теперь стриме [Map.Entry(key=par1, value=1}), Map.Entry(key=par2, value=name)]
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

Только совершенно непонятно, зачем делаь всё это через стримы. Если вы знаете, что значения исходного Map'а - это Map'ы, и вы точно знаете, что вам нужен Map, лежащий под ключом "params", то почему бы просто его не достать?

Map<String, Object> parameters = params.get("params");

Если исходный Map имеет тип Map<String, Object>, но вы точно знаете, что значения - это тоже Map - просто сделайте явное приведение типов.

READ ALSO
Чтение из файла BufferedReader

Чтение из файла BufferedReader

По сути у меня есть метод, который считывает слова из файла и записывает в массивПример текстового файла:

169
Как правильно начать цепочку промисов?

Как правильно начать цепочку промисов?

Имеется 2 обычных функции , f1() и f2()Вторая должна выполнится после окончания выполнения первой

142
как указать PHPStorm свою JS библиотеку, для того чтобы он видел ее методы?

как указать PHPStorm свою JS библиотеку, для того чтобы он видел ее методы?

Шторм не видит мою библиотеку, как я не пытался ее подключить глобальноТе библиотека по факту доступна на данной странице в глобальной области...

127
Яндекс поделиться изменить title кнопки

Яндекс поделиться изменить title кнопки

Проблема с яндекс share, добавляю vkontakte, facebook, twitter, при hover у кнопки vkontakte атрибут "vkontakte" клиент хочет при hover title 'VK'

142