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