Tob*_*ahn 4 java lambda optional
作为一个例子,我有一个像这样的可选:
Optional<Desktop> opt = Optional.ofNullable(status).map(Status::getDesktop);
Run Code Online (Sandbox Code Playgroud)
我想拥有桌面并在lambda表达式之外使用它.我是这样做的:
if (opt.isPresent()){
Desktop desktop = opt.get();
...
}
Run Code Online (Sandbox Code Playgroud)
是否有更好的解决方案来获得桌面; 这样的事情?
Desktop desktop = Optional.ofNullable(status).map(Status::getDesktop).ifPresent(get());
Run Code Online (Sandbox Code Playgroud)
编辑:OrElse是我正在寻找的方法:)
如果您的默认值为Desktop
,则可以尝试Optional.orElse
:
Desktop defaultDesktop = ...;
Desktop desktop = Optional.ofNullable(status)
.map(Status::getDesktop)
.orElse(defaultDesktop);
Run Code Online (Sandbox Code Playgroud)
不过,您不必一定要在Lambda表达式中使用Optional.ifPresent
。您可以完美地使用接收Desktop
实例的方法,该方法将用作以下Consumer
参数Optional.ifPresent
:
Desktop desktop = Optional.ofNullable(status)
.map(Status::getDesktop)
.ifPresent(this::workWithDesktop);
Run Code Online (Sandbox Code Playgroud)
然后:
void workWithDesktop(Desktop desktop) {
// do whatever you need to do with your desktop
}
Run Code Online (Sandbox Code Playgroud)
如果需要其他参数(除了桌面本身),则可以使用lambda表达式来调用该方法:
String arg1 = "hello";
int arg2 = 10;
Desktop desktop = Optional.ofNullable(status)
.map(Status::getDesktop)
.ifPresent(desktop -> this.workWithDesktop(desktop, arg1, arg2));
Run Code Online (Sandbox Code Playgroud)
然后:
void workWithDesktop(Desktop desktop, String arg1, int arg2) {
// do whatever you need to do with your desktop, arg1 and arg2
}
Run Code Online (Sandbox Code Playgroud)
就在上周我被告知这是一个代码味道甚至使用像这样的可选,所以
Desktop desktop = (status != null)? status.getDesktop() : null;
Run Code Online (Sandbox Code Playgroud)