java-8可选双重检查

时间:2015-03-02 09:16:00

标签: java java-8 optional

我喜欢java-8的可选chaning风格。 所以我想检查double null。

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告诉我'循环界面'。

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

3 个答案:

答案 0 :(得分:3)

虽然@Eran提供了一个可能的解决方案,但我并不认为您通过使用链接和Optionals来增加简洁性。

新的Java 8 API和功能不能替代所有Java 8之前的代码。关于使用Stream执行某些任务有很多问题,而简单的for循环可以解决这个问题。

在您的情况下,因为您只想检查引用是否不是null,只需执行以下操作:

public String result() {
    return Objects.requireNonNull(a.getSome()) + Objects.requireNonNull(b.getSome());   
}

答案 1 :(得分:2)

这应该更简单:

public String result() {
    return Optional.ofNullable(a.getSome()).orElseThrow(RuntimeException::new) +
           Optional.ofNullable(b.getSome()).orElseThrow(RuntimeException::new);
}

如果您更改getSome方法以返回Optional<String>,结果方法会更简单:

public String result() {
    return a.getSome().orElseThrow(RuntimeException::new) +
           b.getSome().orElseThrow(RuntimeException::new);
}

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

答案 2 :(得分:0)

在你所谓的“可选样式”中重写你的方法将导致以下怪物:

Optional.ofNullable(a.getSome())
  .flatMap(x -> 
    Optional.ofNullable(b.getSome()).map(x::concat)
  ).orElseThrow(RuntimeException::new)

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

您的IDE抱怨的可能是您使用ab作为方法中的两个变量以及lambdas中的参数名称。你不被允许这样做。