如果存在,可选获取值

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是我正在寻找的方法:)

Fed*_*ner 5

如果您的默认值为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)


dan*_*niu 5

就在上周我被告知这是一个代码味道甚至使用像这样的可选,所以

Desktop desktop = (status != null)? status.getDesktop() : null;
Run Code Online (Sandbox Code Playgroud)