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

List<Map<String, Object>> items

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

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

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

Вопрос:

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

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

8
Przemysław Gęsieniec 5 Окт 2018 в 12:17

1 ответ

Лучший ответ
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"));
5
Andrew Tobilko 5 Окт 2018 в 11:19