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(()->…)
。我确信使用它是一个错误。我想我需要选择抛出异常