检查 Optionals 是否相等的便捷方法

新手上路,请多包涵

我正在寻找一种更方便的方法来证明 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 许可协议

阅读 772
2 个回答

你有很多选择。

已经注意到:

 boolean isEqual = maybeFoo.equals(Optional.of(testFoo));

或者:

 boolean isEqual = maybeFoo.isPresent() && maybeFoo.get().equals(testFoo);

或者:

 boolean isEqual = testFoo.equals(maybeFoo.orElse(null));

最后两个语义略有不同:当 maybeFoo 为空且 testFoo 为空时,每个返回不同的值。不清楚哪个是正确的响应(我猜这是没有标准 API 方法执行此操作的原因之一)。

如果您阅读 Optional API 文档并应用一些想法,您可能会想出其他方法。文档中没有任何魔法。

更一般地说,如果你经常反对它以至于它打扰你,你可能会接近 Optional 错误的哲学。

正如我所见, Optional 是关于承认某些东西不会总是存在,并且您需要(有时是冗长的)代码来处理它。

这应该是例外。只要有可能,尝试创建 不能 为 null 或 Optional.empty() 的变量。

在这种情况不可避免的情况下,接受您需要额外代码的事实。

原文由 slim 发布,翻译遵循 CC BY-SA 3.0 许可协议

Optional 直接实现 equals 方法:

 if (maybeUSB.equals(Optional.ofNullable(testUSB))) {
    ...
}

(您也可以使用 Objects.equals 而不是直接调用 equals

编辑:

如果您希望两者都不存在都是假的,您可以这样做:

 if (maybeUSB.equals(Optional.ofNullable(testUSB)) && maybeUSB.isPresent()) {
    ...
}

原文由 thecoop 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题