使用void方法跨Optional的惯用方式

时间:2018-08-08 09:24:23

标签: java java-8 optional

我有一个Optional,想调用带有其内容的函数(如果存在),否则抛出。问题是map不会采用void方法。

    File file;
    //...
    Optional maybeFile  = Optional.ofNullable(file);
    //..
    maybeFile
        .map(f -> writeTo(f, "stuff")) //Compile error: writeTo() is void
        .orElseThrow(() -> new IllegalStateException("File not set"));

如何在保持writeTo无效的同时实现这一点?

4 个答案:

答案 0 :(得分:5)

orElseThrow返回File对象(如果存在),因此您可以将其写为

writeTo(maybeFile.orElseThrow(() -> new IllegalStateException("File not set")), "stuff");

答案 1 :(得分:1)

您可以使用ifPresentOrElse,这需要2个使用者:

maybeFile.ifPresentOrElse(
    f -> writeTo(f, "stuff"), 
    () -> {
    //absent, so throw exception
    throw new IllegalStateException("File not set");
});

答案 2 :(得分:1)

尽管没有真正的优势,但是您始终可以将方法签名更改为: Void writeTo(...)

,然后将结果捕获为Optional.of(writeTo())

答案 3 :(得分:1)

由于您不必关心结果(返回值是void),因此只需执行以下操作即可:

Optional.ofNullable(f)
            .map(file -> {
                writeTo(file, "");
                return "dummy";
            })
            .orElseThrow(() -> new IllegalStateException("File not set"));

但是再说一次,这对我来说似乎很不对劲,而不是简单的if(f!= null) { ... }