Согласно (почти загадочному) сообщению об ошибке, проблема заключается в методе parseJson
вашего экземпляра parser
, который возвращает необработанный Map
, т. Е. Карту, в которой не указаны типы ееключи и значения.
Этот метод необходим для возврата Map<String, String>
или, по крайней мере, универсального, чтобы он мог возвращать требуемый тип.
РЕДАКТИРОВАТЬ: Я никогда не слышал о вашем парсере JSON.Быстрый поиск в Google показал, что он почти не используется и кажется, что это архивный проектЯ настоятельно рекомендую вам перейти на более качественную библиотеку JSON, такую как Jackson, Gson или, может быть, JSON.simple.
Быстрое и грязное решение с использованием того, что у вас уже есть, - привести возвращенную карту к Map<String, String>
., если вы уверены, что у вас действительно есть строки в качестве значений для всех ваших ключей (в противном случае вы можете столкнуться с ужасной ClassCastException
).
Для этого вам нужно изменить код на:
List<Map<String, String>> resultArray = resultList.stream()
.map(json -> (Map<String, String>) parser.parseJson(json))
.filter(ev -> ev.entrySet().containsAll(filter.entrySet()))
.collect(Collectors.toCollection(ArrayList::new));
Но, опять же, имейте в виду, что это не очень чисто, и что вы можете вносить больше ошибок с этим составом.Лучшее решение - использовать Джексона:
ObjectMapper mapper = new ObjectMapper(); // Jackson JSON lib entry-point
List<Map<String, String>> resultArray = resultList.stream()
.map(json -> {
try {
return mapper.readValue(json, new TypeReference<Map<Striong, String>>() {});
} catch (IOException e) {
throw new UncheckedIOExpcetion(e);
}
})
.filter(ev -> ev.entrySet().containsAll(filter.entrySet()))
.collect(Collectors.toCollection(ArrayList::new));
Рекомендация: лучше переместить весь блок try / catch внутри операции map
в закрытый метод, который возвращает Map<String, String>
.