我正在寻找一种更简便的证明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/