Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用void方法跨可选对象映射的惯用方法_Java_Java 8_Optional - Fatal编程技术网

Java 使用void方法跨可选对象映射的惯用方法

Java 使用void方法跨可选对象映射的惯用方法,java,java-8,optional,Java,Java 8,Optional,我有一个可选的,如果有,我想调用一个包含其内容的函数,如果没有则抛出。问题是map不会采用void方法 File file; //... Optional maybeFile = Optional.ofNullable(file); //.. maybeFile .map(f -> writeTo(f, "stuff")) //Compile error: writeTo() is void .orElseThrow

我有一个
可选的
,如果有,我想调用一个包含其内容的函数,如果没有则抛出。问题是
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
无效的同时,我应该如何实现这一点?

或lsetrow
返回文件对象(如果存在),这样您就可以将其作为

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

您可以使用
ifpresentorese
,它需要两个使用者:

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

虽然没有真正的优势,但您始终可以将方法签名更改为:
Void writeTo(…)

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

由于您不关心(这是一种
void
返回类型),您可以简单地执行以下操作:

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

但是,这对我来说似乎是非常错误的,如果(f!=null){…}

可能你想要
peek
而不是
map
?@Druckles no
peek
可选的
中…这一点很好。我不知道为什么我总是认为有;-)这仅在Java9中可用