Java可选获取(如果存在)

时间:2016-05-04 19:54:13

标签: java java-8 optional

我有一个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);
        }
    }
}

但它仍然给我错误。

1 个答案:

答案 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);
    }
});