如何在 Functional Java 中编写具有两个可选值的变化检测器?

How to Write a Change Detector with Two Optionals in Functional Java?

是否有为两个可选变量编写更改报告器的实用方法?

该代码旨在检测从 可选 A 中的值移动到 可选 B 中的值时的值变化,如果 Optional B 为空,则我们报告默认值。

我想要以下行为:

    +------------+------------+---------+
    | Optional A | Optional B | Result  |
    +------------+------------+---------+
    | empty      | empty      | empty   |
    | empty      | y          | y       |
    | x          | empty      | default |
    | x          | y          | y       |
    | x          | x          | empty   |
    +------------+------------+---------+

我有一个解决方案看起来应该更简单:

public Optional<String> reportChange(Optional<String> aOpt, Optional<String> bOpt) {
   if(aOpt.isPresent() && bOpt.isEmpty()) {
       return Optional.of(DEFAULT_VALUE);
   } else if (bOpt.isEmpty()){
       return Optional.empty();
   }
   return bOpt.flatMap(b -> {
       if (aOpt.isEmpty() || b.compareToIgnoreCase(aOpt.orElseThrow()) != 0) {
           return Optional.of(b);
       }
       return Optional.empty();
   });
}

函数式编程的写法是什么?

虽然这样 Optional 用法不是一个好的做法,但此方法可以满足要求。

据我了解,您的逻辑 x 是一个 不需要的值 ,它可以出现在 可选A。如果 optional B has 存在并且具有 相同的值 结果应该是 empty optional ( table).

的最后一行

条件排除了这种情况。否则,当存在 optional B 时,结果将被 returned。

如果 optional B 为空,则根据 optional A 的存在,结果将是 空可选Optional.of(DEFAULT_VALUE).

public Optional<String> reportChange(Optional<String> a, Optional<String> b) {

    return a.isPresent() && b.isPresent() && a.get().equalsIgnoreCase(b.get()) ?
            Optional.empty() : 
            b.or(() -> a.isPresent() ? Optional.of(DEFAULT_VALUE) : Optional.empty());
}

重要提示:

  • 可选类型仅用作 return 类型。当在 JDK 中引入可选时,这是 Java 设计者的唯一意图。不鼓励使用可选参数。从干净代码的角度来看,更好的选择是“当场”解压两个可选值(在获取这些值的代码中),然后应用条件逻辑。

您的代码可以简化为一个简单的条件表达式:

public Optional<String> reportChange(Optional<String> aOpt, Optional<String> bOpt) {
    return aOpt.equals(bOpt)
       ? Optional.empty()
       : Optional.of(bOpt.orElse(DEFAULT_VALUE));
}