Внутри 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"))
    ...
Другие вопросы по тегам