了解 Optionals.orElse

Understanding Optionals.orElse

我正在尝试学习 Java 8 个可选功能。我对 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");
    }
}

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

userName.setName("John Doe");

喜欢打印 No Name Found

我该怎么做?

TIA

orElse 方法允许您在 Optional 中没有替代值时return一个替代值。

如果您只想打印出一个替代字符串,您可以使用 orElse 方法 return 一个替代字符串:

Optional<String> optionalNameString = Optional.ofNullable(value.getName());
System.out.println(optionalNameString.orElse("Name is not present"));

否则,您可以使用 isPresent()

检查该值是否存在
Optional<String> optionalNameString = Optional.ofNullable(value.getName());
if(optionalNameString.isPresent()) {
    // do something
} else {
    //do something else
}

您对嵌套 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
    );

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