我喜欢java-8的可选chaning风格。所以我想检查双空值。
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);
}发布于 2015-03-02 17:25:30
虽然@Eran给出了一个可能的解决方案,但我不认为你会通过使用链接和选项来增加简单性。
新的Java 8 API和特性不能替代所有Java 8之前的代码。例如,关于使用Stream执行一些任务有很多问题,而一个简单的for循环就可以做到这一点。
在您的示例中,由于您只想检查引用是否不是null,因此只需执行以下操作:
public String result() {
return Objects.requireNonNull(a.getSome()) + Objects.requireNonNull(b.getSome());
}发布于 2015-03-02 17:21:44
这应该要简单得多:
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);
}但是,如果a或b本身可能是null,则需要一些额外的代码来处理。
发布于 2015-03-02 19:22:09
以你所谓的“可选风格”重写你的方法将会导致下面的怪异:
Optional.ofNullable(a.getSome())
.flatMap(x ->
Optional.ofNullable(b.getSome()).map(x::concat)
).orElseThrow(RuntimeException::new)你到底为什么要这样做呢?您正在尝试解决一个不存在的问题。请按照ZouZou的建议使用requireNonNull,但请将每个requireNonNull放在单独的行中,以使堆栈跟踪更容易破译。
你的集成开发环境抱怨的可能是你在方法中使用a和b作为变量,也在lambda中使用参数名。你不能那样做。
https://stackoverflow.com/questions/28806120
复制相似问题