[英]java-8 optional double checking
我喜欢java-8的可选提示样式。 所以我想检查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);
}
尽管@Eran提供了可能的解决方案,但我认为您不会通过使用链接和Optionals来增加简单性。
新的Java 8 API和功能不得替代所有Java 8之前的代码。 例如,有很多问题有关使用Stream
执行某些任务,而简单的for循环可以解决问题。
在您的情况下,由于您只想检查引用是否为null
,只需执行以下操作:
public String result() {
return Objects.requireNonNull(a.getSome()) + Objects.requireNonNull(b.getSome());
}
这应该简单得多:
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
,则需要一些额外的代码来处理。
用所谓的“可选样式”重写方法将导致以下怪诞现象:
Optional.ofNullable(a.getSome())
.flatMap(x ->
Optional.ofNullable(b.getSome()).map(x::concat)
).orElseThrow(RuntimeException::new)
您为什么要在世界上这样做? 您正在尝试解决不存在的问题。 请仅遵循ZouZou的建议并使用requireNonNull
,但是将每个requireNonNull
放在单独的行中,以使堆栈跟踪更易于理解。
您的IDE抱怨的可能是您将a
和b
既用作方法中的变量,又用作lambda中的参数名。 您不允许这样做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.