Java可选获取(如果存在)

Ric*_*ard 6 java optional java-8

我有一个java可选对象,如果它存在,我只想得到它.这里显而易见的代码是:

JsonGenerator gen;
if(value.isPresent()) {
    gen.writeObject(value.get());
}
Run Code Online (Sandbox Code Playgroud)

但我想知道我是否可以通过该ifPresent方法将其转换为1行.如果不存在,我根本不想写它.我试过这样的事情:

gen.writeObject(value.ifPresent(a -> a));
Run Code Online (Sandbox Code Playgroud)

但这显然不起作用.有什么办法可以做我想要的吗?我在网上研究的所有内容都只显示了ifPresent对谓词的方法调用的使用.

编辑1: 我尝试了Tunaki的解决方案但是我收到以下错误:

Error:(25, 46) java: incompatible thrown types java.io.IOException in method reference
Run Code Online (Sandbox Code Playgroud)

这是我的整个代码块:

public class FooSerializer extends JsonSerializer<Foo> {
    @Override
    public void serialize(Foo value,
                          JsonGenerator gen,
                          SerializerProvider serializers) throws IOException {
        value.getFooA().ifPresent(gen::writeObject);
    }
}
Run Code Online (Sandbox Code Playgroud)

我甚至尝试过:

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但它仍然给我错误.

Tun*_*aki 14

您可以在以下位置调用gen.writeObject您的对象的使用者ifPresent:

value.ifPresent(gen::writeObject);
Run Code Online (Sandbox Code Playgroud)

仅当Optional非空时才会调用该方法.

在您的示例中,该方法writeObject抛出已检查的异常IOException; 你将需要捕获它并且要么抛出一个运行时异常(比如new UncheckedIOException,这会使代码变得复杂)或者做一些其他事情(比如记录它):

value.ifPresent(v -> {
    try {
        gen.writeObject(v);
    } catch (IOException e) {
        throw new UncheckedIOException(e);
    }
});
Run Code Online (Sandbox Code Playgroud)