首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数变体从if-elseif else获得值,在Java中

函数变体从if-elseif else获得值,在Java中
EN

Stack Overflow用户
提问于 2019-01-22 19:47:22
回答 2查看 421关注 0票数 3

我不得不处理一些json,它可能以稍微不同的格式出现(而且我只需要json数据的一个子集),我使用JsonPointer (来自杰克逊)来查询json。我为这个问题写了一个非功能性的解决方案,这对我有用,但我想尝试一种功能性的学习方法。在下面的测试程序中,您可以看到我的两个解决方案。它们都能工作,但是功能解决方案变得相当冗长,我收到了Intellij关于在没有isPresent检查的情况下使用get()的恼人警告。我希望看到如何改进功能实现的建议,我很高兴看到使用第三方库的解决方案。这里的基本问题,我想,是如何建模一个if-否则-if-else,其中每个分支应该返回一些值,以一种函数的方式。

代码语言:javascript
复制
@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
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-22 20:11:12

我会把它重写

代码语言:javascript
复制
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);
}

代码语言:javascript
复制
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);
}

代码语言:javascript
复制
private JsonNode getNodeFunc4(JsonNode parentNode) {
    return Stream.of("/foo", "/bar")
                 .map(JsonPointer::compile)
                 .map(parentNode::at)
                 .filter(Predicate.not(JsonNode::isMissingNode))
                 .findFirst()
                 .orElse(parentNode);
}

因为那首歌

代码语言:javascript
复制
if (!parentNode.at(jp1).isMissingNode()) {
    return parentNode.at(jp1);
} else if (!parentNode.at(jp2).isMissingNode()) {
    return parentNode.at(jp2);
}

是代码复制,可以由循环灵活地处理:

代码语言:javascript
复制
for (JsonPointer jsonPointer : jsonPointers) {
    JsonNode kid = parentNode.at(jsonPointer);
    if (!kid.isMissingNode()) {
         return kid;
    }
}
票数 7
EN

Stack Overflow用户

发布于 2019-01-22 21:44:24

需要考虑的是,getNode函数是完美的函数代码:

  • 输出仅取决于输入参数和内部算法。
  • 它没有副作用(它不会从外部世界读取任何东西,也不会向外界写任何东西)
  • 它总是从相同的输入返回相同的输出。
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54315439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档