0

我正在尝试使用 java 流在 jsonNode 流中进行搜索。有一次,我收到了一个 ArrayNode,并在我的班级中使用一个简单的私有方法将其转换为 JsonNodes 列表;但是,当我想使用映射函数映射节点时,我意识到局部变量(节点;在第一个映射中)为空。考虑到我是 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);
        });
4

2 回答 2

0

事实上我已经解决了我的问题;我在 intelliJ 中调试我的应用程序,我遇到了这样一个事实,即在 IntelliJ 的调试器中节点为空。原因很简单,因为我不知道为了在调试器模式下添加断点,我需要选择\lambda“line”而不是“line”。

这就是问题所在。其实一切都很好,没有空指针问题。事实上,我有另一个过滤器问题,当我发现 intelliJ 的调试器如何用于 lambda 表达式时,我就解决了我的问题。最后,我的代码运行良好:

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);

谢谢 不过。

于 2018-09-21T10:28:44.333 回答
0

如果您的nodeis null,这与流或 Java 8 无关,只是您的arrayNodeToListNode操作正在返回null列表中的一些 json 节点。

错误(如果有)在arrayNodeToListNode方法中。如果该方法返回包含某些元素的列表是有效的,则可以在使用 s 之前null完美地过滤掉s ,方法是使用:nullStream.mapStream.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"))
    ...
于 2018-09-20T12:58:45.297 回答