我有一个 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);
}
}
}
但它仍然给我错误。
最佳答案
您可以调用 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);
}
});
关于Java 可选获取如果存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37036846/