检查Optionals平等的便捷方法

时间:2016-05-03 12:46:31

标签: 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也不满意。 我是否真的必须首先装入一个对象才能立即拆箱并检查是否相等?

3 个答案:

答案 0 :(得分:16)

你有很多选择。

已经注意到:

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

可替换地:

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

或者:

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

最后两个语义略有不同:当maybeFoo为空且testFoo为空时,每个语义都会返回不同的值。目前尚不清楚哪个是正确的答案(我猜这是不是标准API方法的原因之一)。

如果您阅读了Optional API文档并应用了一些想法,您可能会想出其他人。没有什么魔法没有出现在文档中。

更一般地说,如果你经常敲打它以免打扰你,你可能会用错误的哲学接近Optional

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

这应该是个例外。尽可能尝试创建无法为空或Optional.empty()的变量。

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

答案 1 :(得分:6)

Optional直接实现equals方法:

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

(您也可以使用Objects.equals而不是直接致电equals

编辑:

如果你想要两者都不是假的,你可以这样做:

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

答案 2 :(得分:0)

这项工作可以吗?

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