Обработка вложенных коллекций с потоками Java 8 - PullRequest
0 голосов
/ 05 октября 2018

В последнее время я столкнулся с проблемой при работе с вложенными коллекциями (значениями Карт внутри Списка):

List<Map<String, Object>> items

Этот список в моем случае содержит 10-20 Карт.В какой-то момент мне пришлось заменить значение Calculation ключа description на Rating.Поэтому я придумаю следующее решение:

items.forEach(e -> e.replace("description","Calculation","Rating"));

Было бы очень хорошим и эффективным решением, если бы все карты в этом списке содержали пару ключ-значение ["description", "Calculation"].К сожалению, я знаю , что в целом будет только одна такая пара List<Map<String, Object>>.

Вопрос в следующем:

Есть ли лучшее (более эффективное) решение для поиска и замены этого единственного значения вместо итерации по всем элементам List с использованием Java-8streams?

Совершенство было бы в том, чтобы сделать это в одном потоке без каких-либо сложных / запутывающих операций над ним.

1 Ответ

0 голосов
/ 05 октября 2018
items.stream()
     .filter(map -> map.containsKey("description"))
     .findFirst()
     .ifPresent(map -> map.replace("description", "Calculation", "Rating"));

Вам придется перебирать список, пока не будет найдена карта с ключом "description".Возьмите первое такое и попробуйте заменить.


Как указал @Holger, если ключ "description" не один для всех карт, а пара ("description", "Calculation")уникальный:

items.stream()
     .anyMatch(m -> m.replace("description", "Calculation", "Rating"));
...