java 检查可选项是否相等的便捷方法

qlfbtfca  于 2023-02-07  发布在  Java
关注(0)|答案(3)|浏览(118)

我正在寻找一种更方便的方法来证明可选值的相等性。
这是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失去了很多相关性。

6jygbczu

6jygbczu1#

你有很多选择。
已经注意到:

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是关于承认某些东西不会总是存在,并且您需要(有时是冗长的)代码来处理它。
这应该是个例外,只要有可能,就尝试创建**不能为空或Optional.empty()的变量。
在不可避免的情况下,接受您需要额外代码的事实。

6tdlim6h

6tdlim6h2#

Optional直接实现equals方法:

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

(you也可以使用Objects.equals,而不是直接调用equals
编辑:
如果希望两者都不存在为false,可以执行以下操作:

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

68de4m5k3#

这样行吗?

if (maybeUSB.map(c -> c.getVersion().equals("3.0")).orElse(false))

相关问题