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

标签 java java-8 optional

我正在寻找一种更简便的证明Optional值相等的方法。

这是Oracle Blog post的建议:

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也不满意。
我真的必须先将一个对象装箱才能立即取消装箱并检查是否相等吗?

编辑II:

很该死的满意:
optional
    .filter(nonOptional::equals)
    .isPresent()

如今。

经过几年的函数式编程,if失去了相关性的很多

最佳答案

您有很多选择。

已经指出:

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

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

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

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

如果您阅读了Optional API文档并提出了一些想法,您可能会提出其他建议。文档中没有任何魔术。

更一般而言,如果您经常要对此加以打扰,以至于打扰您,则可能是您使用错误的原理来接近Optional

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

这应该是异常(exception)。尽可能尝试创建不能为null或Optional.empty()的变量。

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

关于java - 检查Optionals是否相等的便捷方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37004579/

相关文章:

java - 这是在java8中使用嵌套groupby的正确方法吗?

java - 即使抛出异常,Lambda 返回 200

java - 我们如何在 Java 中定义函数 vector ,让函数记住它们的参数?

java - 从 SQLite 存储和检索对象

java - Java 8 中异常类型推断的一个独特功能

java - RunLater 在当前线程上运行或给当前线程一个任务稍后运行

excel - 函数 optional 参数日期类型失败

visual-studio-2013 - MS Visual Studio 2013 中没有 <optional> - 该怎么办?

java - 在 gradle.properties 文件中使用环境变量