我正在尝试使用java流在jsonNode流内部进行搜索。有一次我收到一个ArrayNode,并使用类中的简单私有方法将其转换为JsonNodes列表。但是,当我想使用map fucntion映射节点时,我已经意识到局部变量(node;在第一张地图内部)为null。考虑到我是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);
});
答案 0 :(得分:0)
如果您的Log.d("Log", "video response error: " + error);
Toast.makeText(getActivity(), "Uploading error", Toast.LENGTH_SHORT).show();
pBar.setVisibility(View.GONE);
是node
,则与流或Java 8没有任何关系,只是您的null
操作正在返回arrayNodeToListNode
中的一些json节点清单。
错误(如果有)在null
方法中。如果该方法返回包含一些arrayNodeToListNode
元素的列表是有效的,则可以在使用null
之前通过使用null
来过滤掉Stream.map
个变量:
Stream.filter(Objects::nonNull)
答案 1 :(得分:0)
事实上我已经解决了我的问题;我在intelliJ中调试我的应用程序时,遇到了一个事实,即在IntelliJ的调试器中,该节点为空。原因仅仅是因为我不知道要在调试器模式下添加断点,我需要选择\lambda
而不是“ 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);
但是谢谢。