我正在寻找一种更方便的方法来证明 Optional 值的相等性。
这是一篇 Oracle 博客文章的 建议:
Optional<USB> maybeUSB = ...; maybeUSB.filter(usb -> "3.0".equals(usb.getVersion())
.ifPresent(() -> System.out.println("ok"));
恕我直言,结果类似于
if (maybeUSB.filter(c -> "3.0".equals(c.getVersion())).isPresent()) {
...
}
当然这是一个糟糕的例子,因为它比较的是版本而不是 USB 本身的实例,但我认为它仍然应该证明我的观点。
这真的很好吗?
不
boolean presentAndEquals(Object)
或者
boolean deepEquals(Object)
我在这里错过了什么吗?
编辑:
我对 Optionals.equals 也不满意。我真的必须先装箱一个对象才能立即拆箱并检查是否相等吗?
编辑二:
非常高兴:
optional
.filter(nonOptional::equals)
.isPresent()
如今。
经过几年的函数式编程, if
失去了 很多 相关性。
原文由 Franz Ebner 发布,翻译遵循 CC BY-SA 4.0 许可协议
你有很多选择。
已经注意到:
或者:
或者:
最后两个语义略有不同:当
maybeFoo
为空且testFoo
为空时,每个返回不同的值。不清楚哪个是正确的响应(我猜这是没有标准 API 方法执行此操作的原因之一)。如果您阅读
Optional
API 文档并应用一些想法,您可能会想出其他方法。文档中没有任何魔法。更一般地说,如果你经常反对它以至于它打扰你,你可能会接近
Optional
错误的哲学。正如我所见,
Optional
是关于承认某些东西不会总是存在,并且您需要(有时是冗长的)代码来处理它。这应该是例外。只要有可能,尝试创建 不能 为 null 或
Optional.empty()
的变量。在这种情况不可避免的情况下,接受您需要额外代码的事实。