Удалить одно поле из HashMap при помощи Stream API

114
09 января 2021, 08:40

У меня есть JSON с такой структурой:

{
  "template": "notifyChangeClaimState",
  "data": {
    "claimUid": "111-222-333",
    "attachments": [
      {
        "name": "Shana.jpg",
        "type": "jpg",
        "payload": "base-64 encoding"
      }
    ]
  }
}

который я отображаю на HashMap (не дженерик). Этот HashMap находится в DTO-класе. Мне нужно трансформировать эту мапу в другую мапу так, чтобы она не содержала поле attachments. То есть результат должен быть таким:

{
  "template": "notifyChangeClaimState",
  "data": {
    "claimUid": "111-222-333"
  }
}

Я пытаюсь проделать конвертацию при помощи стримов:

Map<String, String> content = data.entrySet().stream()
                .filter(entry -> !"attachments".equals(entry.getKey()))
                .collect(Collectors.toMap(
                        Map.Entry::getKey,
                        Map.Entry::getValue
                ));

но такой код не компилируется:

Error:(27, 25) java: incompatible types: inference variable R has incompatible bounds
    equality constraints: java.util.Map<K,U>
    lower bounds: java.util.HashMap<java.lang.String,java.lang.String>,java.lang.Object

а строки Map.Entry::getKey помечены как ошибка.

Как исправить этот код, чтобы он заработал?

Answer 1
    Map<String, String> result = (Map<String, String>)data.keySet().stream()
            .filter(key -> !"attachments".equals(key))
            .collect(Collectors.toMap(k->k, v->data.get(v)));
Answer 2

Отфильтровываем ненужное и собираем с привидением типов Map<Object, Object> -> Map<String, String>

Map<String, String> content = data.entrySet()
                .stream()
                .filter(entry -> !"attachments".equals(entry.getKey()))
                .collect(Collectors.toMap(
                        e -> e.getKey().toString(),
                        e -> e.getValue().toString()
                ));
READ ALSO
toString (коллекции)

toString (коллекции)

Этот код выведет в консоль:

90
Spring Boot задержка выполнения метода

Spring Boot задержка выполнения метода

У меня есть клиент-серверное приложениеСерверная часть написана на Spring boot

97
Java Дженерики. Растолкуйте объявление

Java Дженерики. Растолкуйте объявление

Java ДженерикиРастолкуйте объявление для чайников, сигнатуру объявления что делает ? super T читаю, не особо могу вникнуть

108
Распарсить сложный JSON-документ в HashSet

Распарсить сложный JSON-документ в HashSet

Имеется минимальный json-файлик с конфигами:

101