理解Optionals.orElse

5

我正在尝试学习 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");
    }
}

我的担忧是如果设置了名称,一切都能很好地工作,但是当没有设置名称时,我想执行或者。当我评论时,我想做些什么。

userName.setName("John Doe");

比如打印No Name Found

我该怎么做呢?

TIA


2
当您编写 optionalNameString.ifPresent(name -> …) 时,实际的 String 已经在 name 参数中提供,因此在 lambda 表达式中调用 optionalNameString 上的 get() 是没有意义的。同样,在此处调用 orElse 也没有任何意义,因为当 Optional 为空时,lambda 表达式不会被执行。 - Holger
2个回答

12

你使用嵌套的 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
    );

理解的重点是,应用于空的Optional的映射步骤除了返回一个空的Optional之外,不做任何操作。既然您希望在任何情况下都打印内容,因此打印语句不作为使用者传递,而是作为独立语句编写,打印由orElse调用返回的值,该值将是处理步骤的非null结果或备选String


@hogler 我开始了,永远不会太晚 ;) 谢谢你的解释。 - silentsudo
1
非常有用:https://www.oracle.com/technical-resources/articles/java/java8-optional.html - garnet

-1

orElse方法允许您在Optional中没有值时返回替代值。

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

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
}

3
Optional 的目的是为了避免在使用 if 语句时出现 NullPointerException(空指针异常)。 - silentsudo
@sector11 它避免了 NPEs。 - Jude Niroshan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接