首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java-8可选的双重检查

java-8可选的双重检查
EN

Stack Overflow用户
提问于 2015-03-02 17:16:00
回答 3查看 1.5K关注 0票数 2

我喜欢java-8的可选chaning风格。所以我想检查双空值。

代码语言:javascript
复制
class A {
    public String getSome() {
        return ""; // some string
    }
}

class B {
    public String getSome() {
        return ""; // some string
    }
}
class T {
    A a;
    B b;

    public String result() {
        if (a.getSome() != null) {
            if (b.getSome() != null) {
                return a+b;
            } else {
                throw new RuntimeException();
            }
        } else {
            throw new RuntimeException();
        }
    }
}

如何将T.result()转换为可选样式?

我尝试过这种风格,但IDE告诉我“循环接口”。

代码语言:javascript
复制
public String result() {
        return Optional.ofNullable(a.getSome())
                .map(a -> {
                    return Optional.ofNullable(b.getSome())
                            .map(b -> {
                                return a + b;
                            })
                            .orElseThrow(RuntimeException::new);
                })
                .orElseThrow(RuntimeException::new);
    }
EN

回答 3

Stack Overflow用户

发布于 2015-03-02 17:25:30

虽然@Eran给出了一个可能的解决方案,但我不认为你会通过使用链接和选项来增加简单性。

新的Java 8 API和特性不能替代所有Java 8之前的代码。例如,关于使用Stream执行一些任务有很多问题,而一个简单的for循环就可以做到这一点。

在您的示例中,由于您只想检查引用是否不是null,因此只需执行以下操作:

代码语言:javascript
复制
public String result() {
    return Objects.requireNonNull(a.getSome()) + Objects.requireNonNull(b.getSome());   
}
票数 3
EN

Stack Overflow用户

发布于 2015-03-02 17:21:44

这应该要简单得多:

代码语言:javascript
复制
public String result() {
    return Optional.ofNullable(a.getSome()).orElseThrow(RuntimeException::new) +
           Optional.ofNullable(b.getSome()).orElseThrow(RuntimeException::new);
}

如果您将getSome方法更改为返回Optional<String>,则结果方法将更加简单:

代码语言:javascript
复制
public String result() {
    return a.getSome().orElseThrow(RuntimeException::new) +
           b.getSome().orElseThrow(RuntimeException::new);
}

但是,如果ab本身可能是null,则需要一些额外的代码来处理。

票数 2
EN

Stack Overflow用户

发布于 2015-03-02 19:22:09

以你所谓的“可选风格”重写你的方法将会导致下面的怪异:

代码语言:javascript
复制
Optional.ofNullable(a.getSome())
  .flatMap(x -> 
    Optional.ofNullable(b.getSome()).map(x::concat)
  ).orElseThrow(RuntimeException::new)

你到底为什么要这样做呢?您正在尝试解决一个不存在的问题。请按照ZouZou的建议使用requireNonNull,但请将每个requireNonNull放在单独的行中,以使堆栈跟踪更容易破译。

你的集成开发环境抱怨的可能是你在方法中使用ab作为变量,也在lambda中使用参数名。你不能那样做。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28806120

复制
相关文章

相似问题

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