我有一个java可选对象,如果它存在,我只想得到它。这里显而易见的代码是:
JsonGenerator gen;
if(value.isPresent()) {
gen.writeObject(value.get());
}
但是我想知道我是否可以使用ifPresent
方法将其简化为1行。如果它不存在,我根本不想写它。我试过这样的事情:
gen.writeObject(value.ifPresent(a -> a));
但这显然不起作用。有什么办法可以做我想要的吗?我在网上研究过的所有内容都只显示ifPresent
使用谓词的方法调用。
编辑1: 我尝试了Tunaki的解决方案,但是我收到了以下错误:
Error:(25, 46) java: incompatible thrown types java.io.IOException in method reference
这是我的整个代码块:
public class FooSerializer extends JsonSerializer<Foo> {
@Override
public void serialize(Foo value,
JsonGenerator gen,
SerializerProvider serializers) throws IOException {
value.getFooA().ifPresent(gen::writeObject);
}
}
我甚至尝试过:
public class FooSerializer extends JsonSerializer<Foo> {
@Override
public void serialize(Foo value,
JsonGenerator gen,
SerializerProvider serializers) throws IOException {
try {
value.getContactInfo().ifPresent(gen::writeObject);
} catch(IOException e) {
throw new UncheckedIOException(e);
}
}
}
但它仍然给我错误。
答案 0 :(得分:14)
您可以在gen.writeObject
中调用ifPresent
作为对象的使用者:
value.ifPresent(gen::writeObject);
仅当Optional
不为空时才会调用该方法。
在您的示例中,方法writeObject
会抛出已检查的异常IOException
;您将需要捕获它并且要么抛出运行时异常(比如新的UncheckedIOException
,这会使代码变得复杂)或者执行其他操作(比如记录它):
value.ifPresent(v -> {
try {
gen.writeObject(v);
} catch (IOException e) {
throw new UncheckedIOException(e);
}
});