java - "Unwrap"在 Java 流(或并行流)中返回之前 Optional.empty 的可选

标签 java functional-programming java-stream

我在这件简单的事情上遇到了麻烦。我有一个返回 Optional<TypeA> 的方法:

public Optional<TypeA> getFirst() {
  return set.stream().filter(it -> it.getStatus() == SUCCESS).findFirst(); // set is a Set<TypeA>
}

...然后我从以下位置调用它:
public boolean hasFirst() {
  return types.parallelStream() // types is a List<TypeB> that has a Set<TypeA>
    .filter(it -> it.getTotalAmount() > 0)
    .map(TypeA::getFirst)
    .findFirst() // this can return an Optional[Optional.empty]
    .isPresent();
}

问题是,空 OptionalOptional 返回 true ,正如预期的那样,所以我不知道如何正确解决这个问题!

有什么线索吗?

最佳答案

您可以使用 Optional#flatMap 来“解开”内部可选内容:

public boolean hasFirst() {
   return types.parallelStream()
       .filter(it -> it.getTotalAmount() > 0)
       .map(TypeA::getFirst)
       .findFirst() // return Optional[Optional.empty]
       .flatMap(i -> i) // <---
       .isPresent(); // true
}

If a value is present, apply the provided Optional-bearing mapping function to it, return that result, otherwise return an empty Optional.

关于java - "Unwrap"在 Java 流(或并行流)中返回之前 Optional.empty 的可选,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41557087/

相关文章:

recursion - 尾递归与前向递归

java - 为什么共享可变性不好?

java - 如何使用 lambda 或流从包含另一个对象列表列表的对象列表中迭代并获取对象

javascript - Java 服务器不使用 OutboundSseEvent/JAX-RS 服务器发送事件 (SSE) 服务发送消息事件

java - 如何使用 Java 和 OpenOffice UNO API 操作 odt 文件中的嵌入文件

java - 从适配器 -> CustomView 中更改 Activity 的 EditText

f# - 从两个数组创建元组的更实用的方法

java - 创建一个在字符串开头没有两个字符匹配的正则表达式。

node.js - 用于 CSV 解析的 Highland.js

java - Java 中的流式传输到 IntStream