我正在寻找一种更方便的方法来证明可选值的相等性。
这是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)
我错过什么了吗?
- 编辑:**
我也不太喜欢可选的。等于。我真的必须先把一个对象装箱,然后立即取消装箱并检查是否相等吗?
- 编辑II:**
非常满意:
optional
.filter(nonOptional::equals)
.isPresent()
如今。
经过几年的函数式编程,if
失去了很多相关性。
3条答案
按热度按时间6jygbczu1#
你有很多选择。
已经注意到:
或者:
或者:
最后两种语言的语义略有不同:当
maybeFoo
为空和testFoo
为null时,每个函数返回不同的值。不清楚哪个是正确的响应(我猜这是没有标准API方法执行此操作的原因之一)。如果你阅读了
Optional
API文档并进行一些思考,你可能会想出其他的方法,文档中没有什么神奇的东西。更一般地说,如果您经常碰到这个问题,以至于让它困扰您,那么您可能用错误的哲学来处理
Optional
。在我看来,
Optional
是关于承认某些东西不会总是存在,并且您需要(有时是冗长的)代码来处理它。这应该是个例外,只要有可能,就尝试创建**不能为空或
Optional.empty()
的变量。在不可避免的情况下,接受您需要额外代码的事实。
6tdlim6h2#
Optional
直接实现equals
方法:(you也可以使用
Objects.equals
,而不是直接调用equals
)编辑:
如果希望两者都不存在为false,可以执行以下操作:
68de4m5k3#
这样行吗?