Java 可选的orElse中的流

Java 可选的orElse中的流,java,java-8,java-stream,optional,Java,Java 8,Java Stream,Optional,我试图在orElse中使用流,但很难理解错误 collectorConfiguration = Optional.ofNullable(recapPlacement.getAttId()) .map(attId -> Optional.ofNullable(processorEngine.buildFrimFromAttId(attId)) .orElseThrow( () -> new OmegaException("UnableToFirmByAttId

我试图在
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()))
    );
总的来说,在上面的代码中,我试图

  • 如果
    attId
    不为空,则获取
    collectorConfig

  • 如果
    attId
    不为null,并且未找到该
    attId
    collectorConfig
    ,则我将引发异常

  • 如果
    attId
    为空,则我将使用
    pnet
    code通过流式
    collectConfigurations
    列表获取
    collectConfig

  • 如果未为
    pnetCode
    找到
    collectConfig
    ,则我将引发异常


  • 它在
    orElse
    块中给出编译错误“
    lambda表达式的目标类型必须是接口”

    orElse
    采用常规值,而不是lambda可以表示的任何值。只需删除
    ()->
    就可以了。或者,您可能打算调用您可能要替换的
    orElseGet

    .orElse( () -> Optional.ofNullable(collectorConfigurations.stream() //getting error here
    
    期望供应商为:

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

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

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

    错误是什么?lambda表达式的目标类型必须是Interface设置要编译的复杂流管道可能很棘手。有一些通常有用的问题解决技巧:1)向所有lambda添加参数类型:
    (ArgType arg)->……
    。2) 将显式类型参数添加到方法:
    .orElse(…)
    。3) 将整个lambda提取到局部变量。局部变量通常如下所示:
    Function=…
    ,这使得设置显式类型参数变得容易。应用这些技术通常会产生更精确的编译错误,并帮助您发现问题。当问题得到解决时,可以删除帮助器类型和变量。代码中使用了哪些变量?我建议对
    recapPlacement.getAttId()
    的结果使用简单的旧if-else测试。
    很好,但是您在这里使用
    可选
    的方式违反了它的API注释及其作者的建议。有关使代码可读的一些方法,请参阅。如果我删除“()->”,则它将是可选的(),而orElse@arjun好啊我们没有足够的代码来推断这里所期望的类型,但是在optionals中的整个包装似乎是不必要的。为什么将
    stream()
    调用的结果包装为可选?这将永远不会返回null。很抱歉,这是一个错误。我添加它是为了可以在可选()上抛出异常。这就是错误所在。我想我需要可选的来抛出异常。OrelGet()需要一个收集器配置,但由于我在它上面使用了可选的(),它抛出了错误的返回类型编译错误。请确保使用
    ()->
    作为
    的一部分。OrelGet(()->…)
    。我确信使用它是一个错误。我想我需要选择抛出异常