检查Optionals平等的便捷方法

Fra*_*ner 13 java optional java-8

我正在寻找一种更方便的方法来证明Optional值的相等性.

这是Oracle博客文章建议的内容:

Optional<USB> maybeUSB = ...; maybeUSB.filter(usb -> "3.0".equals(usb.getVersion())
                    .ifPresent(() -> System.out.println("ok"));
Run Code Online (Sandbox Code Playgroud)

恕我直言的结果是这样的

if (maybeUSB.filter(c -> "3.0".equals(c.getVersion())).isPresent()) {
   ...
}
Run Code Online (Sandbox Code Playgroud)

当然这是一个糟糕的例子,因为它比较了版本而不是USB本身的实例,但我认为它仍然可以证明我的观点.

这真的很棒吗?

没有

boolean presentAndEquals(Object)
Run Code Online (Sandbox Code Playgroud)

要么

boolean deepEquals(Object)
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么吗?

编辑:

我对Optionals.equals也不满意.我是否真的必须首先装箱一个物体才能立即拆箱并检查是否相等?

sli*_*lim 22

你有很多选择.

已经注意到了:

boolean isEqual = maybeFoo.equals(Optional.of(testFoo));
Run Code Online (Sandbox Code Playgroud)

或者:

boolean isEqual = maybeFoo.isPresent() && maybeFoo.get().equals(testFoo);
Run Code Online (Sandbox Code Playgroud)

要么:

boolean isEqual = testFoo.equals(maybeFoo.orElse(null));
Run Code Online (Sandbox Code Playgroud)

最后两个语义确实有一些不同的语义:当maybeFoo为空时,每个语句返回一个不同的值,并且testFoo为null.目前尚不清楚哪个是正确的响应(我猜这是没有标准API方法的原因之一).

如果您阅读OptionalAPI文档并应用一些想法,您可能会想出其他人.文档中没有任何魔法.

更一般地说,如果你经常敲打它来打扰你,你可能会接受Optional错误的哲学.

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

这应该是例外.尽可能尝试创建不能为null或的变量Optional.empty().

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


the*_*oop 7

Optionalequals直接实现该方法:

if (maybeUSB.equals(Optional.ofNullable(testUSB))) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

(你也可以使用Objects.equals而不是equals直接打电话)

编辑:

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

if (maybeUSB.equals(Optional.ofNullable(testUSB)) && maybeUSB.isPresent()) {
    ...
}
Run Code Online (Sandbox Code Playgroud)


Hai*_*han 6

这行得通吗?

if (maybeUSB.map(c -> c.getVersion().equals("3.0")).orElse(false))
Run Code Online (Sandbox Code Playgroud)