如何在 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));
}
是否有为两个可选变量编写更改报告器的实用方法?
该代码旨在检测从 可选 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));
}