我喜欢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);
}
答案 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);
}
但是,如果a
或b
本身可能是null
,则需要一些额外的代码来处理它。
答案 2 :(得分:0)
在你所谓的“可选样式”中重写你的方法将导致以下怪物:
Optional.ofNullable(a.getSome())
.flatMap(x ->
Optional.ofNullable(b.getSome()).map(x::concat)
).orElseThrow(RuntimeException::new)
为什么世界上你想要这样做?您正在尝试解决不存在的问题。请按照ZouZou的建议并使用requireNonNull
,但将每个requireNonNull
放在一个单独的行中,以便更容易破解堆栈跟踪。
您的IDE抱怨的可能是您使用a
和b
作为方法中的两个变量以及lambdas中的参数名称。你不被允许这样做。