ifPresent返回一些东西,否则

时间:2019-03-07 11:54:46

标签: java java-8 java-stream optional

我需要以下代码段的帮助。.raiseWorkQueueTask应该返回通知,如果它可以找到任何null != previousPeriod.getOldId()并且outcomeCode的{​​{1}}为“ L3 “ ....但是我在

处遇到错误
riseWorkQueue

我收到一个错误消息,说*.ifPresent(()->proceedWorkQueue(ip)).orElse(null);* ..我也尝试了其他变体...

"Cannot infer functional interface"

.ifPresent(()->proceedWorkQueue(ip).orElse(null));
.ifPresent(proceedWorkQueue(ip).orElse(null));

2 个答案:

答案 0 :(得分:1)

您可能正在寻找map为:

private Optional<Notification> riseWorkQueueTask(IP ip) {
    return ip.getPreviousPeriods().stream()
            .filter(previousPeriod -> null != previousPeriod.getOldId())
            .findAny()
            .map(i -> proceedWorkQueue(i).orElse(null)); 
    // orElse if 'proceedWorkQueue' returns empty Optional
}

或者更简单地将flatMap用作:

private Optional<Notification> riseWorkQueueTask(IP ip) {
    return ip.getPreviousPeriods().stream()
            .filter(previousPeriod -> null != previousPeriod.getOldId())
            .findAny()
            .flatMap(i -> proceedWorkQueue(i));
}

答案 1 :(得分:0)

ifPresent是一个void方法,用于处理可选参数的最终值。但是,您收到的错误是由于您传递的lambda与预期功能接口的签名不匹配而引起的。应该是:

//the lambda must take 1 parameter, even if you don't use it
.ifPresent(period -> proceedWorkQueue(ip)) 

如果您需要仅运行proceedWorkQueue(ip)(如果可选参数具有值),则可以调用map(有点作弊):

return ip.getPreviousPeriods().stream()
        .filter(previousPeriod -> null != previousPeriod.getOldId())
        .findAny()
        .map(period ->{proceedWorkQueue(ip); return period;});

或使用if块以可读的方式编写它:

Optional<Notification> value = ip.getPreviousPeriods().stream()
        .filter(previousPeriod -> null != previousPeriod.getOldId())
        .findAny();

if(value.isPresent()) {
    proceedWorkQueue(ip);
}

return value;