了解 Optionals.orElse

sil*_*udo 2 java null optional notnull java-8

我正在尝试学习Java 8 功能 Optional。我对 Optional.orElse 的工作方式感到困惑。这是我尝试过的:

public class OptionalsExample {

    public static void main(String[] args) {
        Name userName = new Name();
        userName.setName("John Doe");
        Optional<Name> optionalName = Optional.ofNullable(userName);
        optionalName.ifPresent(
                (Name value) -> {
                    Optional<String> optionalNameString = Optional.ofNullable(value.getName());
                    optionalNameString.ifPresent(name -> System.err.println("Name is: " + optionalNameString.get()));
                }
        );
    }
    private static void printError() {
        System.err.println("No Name present");
    }
}
Run Code Online (Sandbox Code Playgroud)

我担心的是,如果设置了 name 一切正常,但是当没有设置 name 时,我想执行orElse。我想在评论时做点什么

userName.setName("John Doe");
Run Code Online (Sandbox Code Playgroud)

喜欢打印 No Name Found

我怎样才能做到这一点?

TIA

Hol*_*ger 8

您对嵌套ifPresent调用的使用与对流的(嵌套)forEach调用非常相似,可以在许多其他问题中看到。

它们清楚地表明你应该更好地尝试功能性思维。

你想做的是

System.out.println(
    Optional.ofNullable(userName) // will be an empty optional if userName is null
            .map(Name::getName)   // will turn to empty optional if getName returns null
            .map("Name is: "::concat) // prepend "Name is: " (only when we have a name)
            .orElse("No Name Found") // get the result string or the alternative
    );
Run Code Online (Sandbox Code Playgroud)

要理解的重要一点是,map应用于空的ping 步骤Optional除了Optional再次返回空之外什么都不做。由于您想在任何一种情况下都打印,因此打印语句不是作为消费者传递的,而是作为独立语句编写的,打印orElse调用返回的值,这将是null处理步骤的非结果或替代String.