java - Stream in orElse of optional

标签 java java-8 java-stream option-type

我正在尝试在 orElse 中使用 Stream 并且难以理解错误。

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. 如果 attId 不为 null,则获取 collectorConfig

  2. 如果 attId 不为 null 并且未找到该 attIdcollectorConfig 那么我将抛出异常

    <
  3. 如果 attId 为空,那么我将使用 pnet 代码通过流式传输 collectConfigurations 获取 collectConfig列表

  4. 如果 pnetCode 没有找到 collectConfig,那么我将抛出异常

它在 orElse block 中给出编译错误“Lambda 表达式的目标类型必须是一个接口(interface)”。

最佳答案

你可能想替换

.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...

关于java - Stream in orElse of optional,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53416163/

相关文章:

java - 模拟辅助方法的返回值

java.lang.NoSuchMethodError Ant/Maven 通过命令行失败

java - 我如何创建一个 XPath 来查找按钮文本或按钮内嵌套元素的文本?

java - 使用转换的 lambda 表达式初始化数组

java-8 - 使用匹配属性更新列表中元素的属性

java 8流转换复杂 map

java - 在 Vaadin 中为网格的每一行添加一个鼠标监听器

java - Instant 和 LocalDateTime 有什么区别?

java - 如何在 anyMatch() java 8 流中应用复合 BiPredicate

java - 在 Java Stream 中组合过滤器和映射