我正在寻找一种更方便的方法来证明可选值的相等性。
这就是一个Oracle 博客文章 http://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html建议:
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 本身的实例,但我认为它仍然应该证明我的观点。
这真的是最好的吗?
No
boolean presentAndEquals(Object)
or
boolean deepEquals(Object)
我在这里错过了什么吗?
EDIT:
我对Optionals.equals 也不太满意。
我真的必须先装箱一个对象才能立即拆箱并检查是否相等吗?
EDIT II:
非常满意:
optional
.filter(nonOptional::equals)
.isPresent()
如今。
经过几年的函数式编程,if
失去一个lot的相关性。
你有很多选择。
已经注意到:
boolean isEqual = maybeFoo.equals(Optional.of(testFoo));
或者:
boolean isEqual = maybeFoo.isPresent() && maybeFoo.get().equals(testFoo);
Or:
boolean isEqual = testFoo.equals(maybeFoo.orElse(null));
最后两个确实有稍微不同的语义:每个返回不同的值maybeFoo
是空的并且testFoo
一片空白。目前尚不清楚哪个是正确的响应(我猜这是没有标准 API 方法可以执行此操作的原因之一)。
如果您阅读了以下内容,您可能会想到其他的Optional
API 文档并应用一些想法。文档中没有什么魔法是不存在的。
更一般地说,如果你经常碰到这个问题,以至于它让你感到困扰,那么你可能正在接近Optional
错误的哲学。
照我看来,Optional
是要承认某些东西不会总是存在,并且您需要(有时是冗长的)代码来处理它。
这应该是例外。只要有可能,尝试创建变量can't为空或Optional.empty()
.
在这种情况不可避免的情况下,请接受您需要额外代码的事实。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)