Внутри Java-потока функция map не распознает мою локальную переменную - PullRequest
0 голосов
/ 20 сентября 2018

Я пытаюсь найти внутри потока 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 ]

0 голосов
/ 21 сентября 2018

На самом деле я решил свою проблему;Я отлаживал свое приложение в IntelliJ и столкнулся с тем фактом, что в отладчике IntelliJ узел был нулевым.Причина была просто в том, что я не знал, чтобы добавить точки останова в режиме отладчика, мне нужно было выбрать \lambda вместо «line».

В этом была проблема.На самом деле все было хорошо, без проблем с нулевым указателем.У меня фактически была другая проблема с фильтром, и как только я обнаружил, как отладчик 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);

Спасибо, однако.

0 голосов
/ 20 сентября 2018

Если ваш node равен null, это не имеет ничего общего с потоками или Java 8, просто ваша операция arrayNodeToListNode возвращает несколько null узлов json в списке.

Ошибка (если есть) в методе arrayNodeToListNode.Если для этого метода допустимо возвращать список с некоторыми null элементами, вы можете идеально отфильтровать null s перед использованием 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"))
    ...
...