Внутри Java-потока функция map не распознает мою локальную переменную
Я пытаюсь найти внутри потока jsonNode, используя поток Java. В какой-то момент я получил ArrayNode и преобразовал его в список JsonNode, используя простой закрытый метод в моем классе; однако, когда я хочу использовать функцию карты для сопоставления моего узла, я понял, что локальная переменная (узел; внутри первой карты) равна нулю. Я не понимаю, почему и как решить эту проблему, учитывая, что я новичок в Java 8. Я публикую свой код здесь:
List<JsonNode> msgs = arrayNodeToListNode((ArrayNode) kmsResponse.at(kmsResponsePath));
msgs.stream().forEach(t -> {
List<JsonNode> jsonNodes = arrayNodeToListNode((ArrayNode) t.get("coverageList"));
List<JsonNode> collect = jsonNodes.stream()
.map(node -> node.get("/coverage/coverageTypeLevel"))
.filter(node -> formule.equals(node.get("aggReference").textValue()))
.map(node -> t.get("premiumSplittedList"))
.map(node -> node.get("value")).collect(Collectors.toList());
String value = collect.toString();
response.append(collect);
});
2 ответа
На самом деле я решил свою проблему; Я отлаживал свое приложение в IntelliJ и столкнулся с тем фактом, что в отладчике IntelliJ узел был нулевым. Причина была просто потому, что я не знал, чтобы добавить точки останова в режиме отладчика, мне нужно было выбрать \lambda
вместо "линии".
Это была проблема. На самом деле все было хорошо, без проблем с нулевым указателем. У меня фактически была другая проблема с фильтром, и как только я обнаружил, как отладчик intelliJ функционирует для лямбда-выражений, я решил свою проблему. В конце у меня есть этот код, который работает очень хорошо:
StringBuilder response = new StringBuilder();
List<JsonNode> msgs = arrayNodeToListNode((ArrayNode) kmsResponse.at(kmsResponsePath));
List<JsonNode> collect1 = msgs.stream().filter(node -> {
List<JsonNode> collect = arrayNodeToListNode((ArrayNode) node.get("coverageList")).stream()
.map(entry -> entry.at("/coverage/coverageTypeLevel"))
.filter(enttry -> formule.equals(enttry.get("aggReference").textValue())).collect(Collectors.toList());
return collect.size() > 0;
}
).collect(Collectors.toList());
response.append(collect1);
Спасибо однако.
Если твой node
является null
, это не имеет ничего общего с потоками или Java 8, просто ваш arrayNodeToListNode
операция возвращает некоторые null
Узлы JSON в списке.
Ошибка (если есть) в arrayNodeToListNode
метод. Если для этого метода допустимо возвращать список с некоторыми null
элементы, вы можете отлично фильтровать null
перед использованием Stream.map
, используя Stream.filter(Objects::nonNull)
:
List<JsonNode> jsonNodes = arrayNodeToListNode((ArrayNode) t.get("coverageList"));
List<JsonNode> collect = jsonNodes.stream()
.filter(Objects::nonNull)
.map(node -> node.get("/coverage/coverageTypeLevel"))
...