如果存在,可选获取值

时间:2017-12-15 14:55:12

标签: java lambda optional

作为一个例子,我有一个像这样的可选项:

Optional<Desktop> opt = Optional.ofNullable(status).map(Status::getDesktop);

我想拥有桌面并在lambda表达式之外使用它。我是这样做的:

if (opt.isPresent()){
    Desktop desktop = opt.get();
    ...
}

是否有更好的解决方案来获取桌面;这样的事情?

Desktop desktop = Optional.ofNullable(status).map(Status::getDesktop).ifPresent(get());

编辑:OrElse是我正在寻找的方法:)

2 个答案:

答案 0 :(得分:5)

上周我在这里被告知,甚至使用像这样的可选代码气味,所以

Desktop desktop = (status != null)? status.getDesktop() : null;

答案 1 :(得分:2)

如果您的Desktop有默认值,则可以尝试使用Optional.orElse

Desktop defaultDesktop = ...;

Desktop desktop = Optional.ofNullable(status)
    .map(Status::getDesktop)
    .orElse(defaultDesktop);

但是,您不必在Optional.ifPresent的lambda表达式中工作。您可以完美地使用接收Desktop实例的方法,该实例将充当Consumer的{​​{1}}参数:

Optional.ifPresent

然后:

Desktop desktop = Optional.ofNullable(status)
    .map(Status::getDesktop)
    .ifPresent(this::workWithDesktop);

如果您需要其他参数(除了桌面本身),您可以使用调用该方法的lambda表达式:

void workWithDesktop(Desktop desktop) {
    // do whatever you need to do with your desktop
}

然后:

String arg1 = "hello";
int arg2 = 10;

Desktop desktop = Optional.ofNullable(status)
    .map(Status::getDesktop)
    .ifPresent(desktop -> this.workWithDesktop(desktop, arg1, arg2));