在其他可选流中

时间:2018-11-21 16:11:05

标签: java java-8 java-stream optional

我试图在Stream中使用orElse,但难以理解错误。

collectorConfiguration = Optional.ofNullable(recapPlacement.getAttId())
    .map(attId -> Optional.ofNullable(processorEngine.buildFrimFromAttId(attId))
         .orElseThrow( () -> new OmegaException("UnableToFirmByAttId", recapPlacement.getAttId())))
    .orElse( () -> Optional.ofNullable(collectorConfigurations.stream() //getting error here
        .filter(cc -> recapPlacement.getPnetCode().equals(cc.getPnetCode()))
        .filter(Objects::nonNull)
        .findFirst())
        .orElseThrow( () -> new OmegaException("CollectorCouldNotMapForPnetCode", recapPlacement.getPnetCode()))
    );

我试图在以上代码中总体上

  1. 如果collectorConfig不为空,则获取attId

  2. 如果attId不为空并且没有为该collectorConfig找到attId,那么我抛出异常

  3. 如果attId为空,那么我正在使用pnet代码通过流collectConfig列表来获取collectConfigurations

  4. 如果找不到collectConfig的{​​{1}},那么我抛出异常

它在pnetCode块中给出了编译错误'Target type of a lambda expression must be an interface'。

2 个答案:

答案 0 :(得分:3)

您可能要替换

.orElse( () -> Optional.ofNullable(collectorConfigurations.stream() //getting error here

带有Optional.orElseGet,期望Supplier为:

.orElseGet( () -> Optional.ofNullable(collectorConfigurations.stream() ...

除上述内容外,您不需要供应商中的Optional.ofNullable

.orElseGet( () -> collectorConfigurations.stream()
    .filter(cc -> recapPlacement.getPnetCode().equals(cc.getPnetCode()))
    .filter(Objects::nonNull) //non-null filtered
    .findFirst()) // optional
    .orElseThrow( () -> new OmegaException("CollectorCouldNotMapForPnet...

答案 1 :(得分:1)

orElse采用常规值,而不是用lambda表示的任何值。只需删除() ->应该会有所帮助。另外,您可能打算致电orElseGet