Java 可选获取如果存在

标签 java java-8 option-type

我有一个 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/

相关文章:

java - Maven 发布插件跳过执行测试但不准备

java - 对多个函数执行相同的操作

java - SonarQube 8.1.0 提示在访问该值之前调用 "Optional#isPresent()"

java - 可以在可选的任何东西中

java - 无法使用 Java SocketFactory 库连接到 Cloud SQL

Java 正则表达式在关闭标记后添加空格(如果不存在)

java - 如何在 scenform 中将模型旋转到另一个模型?

Java8 流奇怪的行为

java - Spring 入站 channel 适配器 - 如何自动删除超过 10 天的文件夹和文件

java - 如何用java流添加所有内容?