在Java中从if-elseif-else获取值的功能变体
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在Java中从if-elseif-else获取值的功能变体,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2735字,纯文字阅读大概需要4分钟。
内容图文
![在Java中从if-elseif-else获取值的功能变体](/upload/InfoBanner/zyjiaocheng/670/7e838908c9bc4bdfaa106de0a965c454.jpg)
我必须处理一些json,这些json的格式可能略有不同(并且我只需要json数据的一个子集),然后我使用了JsonPointer(来自Jackson)来查询json.我为这个问题写了一个非功能性的解决方案,对我很有效,但是我想尝试一种功能性的方法来达到学习目的.在下面的测试程序中,您可以看到我的两种解决方案.它们都可以工作,但是功能性解决方案变得非常冗长,Intellij向我发出了有关使用get()而不使用isPresent检查的恼人警告.我希望看到有关如何改善功能实现的建议,并且很高兴看到使用第三方库的解决方案.我想这里的基本问题是如何对if-else-if-else进行建模,其中每个分支都应该以功能性方式返回一些值.
@Test
public void testIt() {
ObjectMapper om = new ObjectMapper();
ImmutableList.of(
"{ \"foo\": { \"key\": \"1\" } }",
"{ \"bar\": { \"key\": \"1\" } }",
"{ \"key\": \"1\" }")
.forEach(str -> {
try {
System.out.println("Non-functional: " + getNode(om.readTree(str)));
System.out.println("Functional: " + getNodeFunc(om.readTree(str)));
} catch (Exception e) {
throw new RuntimeException("", e);
}
});
}
private JsonNode getNode(JsonNode parentNode) {
JsonPointer jp1 = JsonPointer.compile("/foo");
JsonPointer jp2 = JsonPointer.compile("/bar");
if (!parentNode.at(jp1).isMissingNode()) {
return parentNode.at(jp1);
} else if (!parentNode.at(jp2).isMissingNode()) {
return parentNode.at(jp2);
}
return parentNode;
}
private JsonNode getNodeFunc(JsonNode parentNode) {
BiFunction<JsonNode, String, Optional<JsonNode>> findNode = (node, path) -> {
JsonPointer jp = JsonPointer.compile(path);
return node.at(jp).isMissingNode() ? Optional.empty() : Optional.of(node.at(jp));
};
return findNode.apply(parentNode, "/foo")
.map(Optional::of)
.orElseGet(() -> findNode.apply(parentNode, "/bar"))
.map(Optional::of)
.orElse(Optional.of(parentNode))
.get(); // Intellij complains here: Optional.get() without isPresent check
}
解决方法:
我将其重写为
private JsonNode getNodeFunc2(JsonNode parentNode) {
return Stream.of(JsonPointer.compile("/foo"), JsonPointer.compile("/bar"))
.filter(i -> !parentNode.at(i).isMissingNode())
.findFirst()
.map(parentNode::at)
.orElse(parentNode);
}
要么
private JsonNode getNodeFunc3(JsonNode parentNode) {
return Stream.of(JsonPointer.compile("/foo"), JsonPointer.compile("/bar"))
.map(parentNode::at)
.filter(Predicate.not(JsonNode::isMissingNode))
.findFirst()
.orElse(parentNode);
}
要么
private JsonNode getNodeFunc4(JsonNode parentNode) {
return Stream.of("/foo", "/bar")
.map(JsonPointer::compile)
.map(parentNode::at)
.filter(Predicate.not(JsonNode::isMissingNode))
.findFirst()
.orElse(parentNode);
}
因为那块
if (!parentNode.at(jp1).isMissingNode()) {
return parentNode.at(jp1);
} else if (!parentNode.at(jp2).isMissingNode()) {
return parentNode.at(jp2);
}
是代码重复,可以通过循环整齐地处理:
for (JsonPointer jsonPointer : jsonPointers) {
JsonNode kid = parentNode.at(jsonPointer);
if (!kid.isMissingNode()) {
return kid;
}
}
内容总结
以上是互联网集市为您收集整理的在Java中从if-elseif-else获取值的功能变体全部内容,希望文章能够帮你解决在Java中从if-elseif-else获取值的功能变体所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。