Java Optional很复杂
长期以来,我一直没有用Java编写代码,因为如果需要JVM,那么我要去Scala 。 但是,这种情况有时会发生变化,尤其是当我必须在Java商店工作时。
随着Java语言的新发展,我想说Java与几年前相比更容易使用。 在函数式编程方面有很多进展,可以从Java的最新版本的最新版本中看出。
经过努力整合了所有这些功能之后,很少有一些功能尚未完全完善。
让我们看看Optional以及如何使用它,以及它与Scala的比较。 选项 。
Optional背后的主要思想是避免null并避免NullPointerException。 但是,感觉到我们在Java中发现的实际上促进了null的使用。 让我们看看如何。
这将抛出NullPointerException 每次我们向其发送null时。 相反,我们需要使用.ofNullable
方法。
避免这些例外不是主要思想吗? 那为什么我们要得到两种工作方式却截然不同,结果却截然不同的方法。
在Scala中 ,我们只需要做:
请注意,我将类型保持在最高级别,因此每个人实际上都可以为空。
关键是Option.apply(somethingNull)
与Option(somethingNull)
相同,它将处理null并为我们创建适当的结果,而不会引发NullPointerException,这是我们要避免的确切问题。
出于我们自己的考虑, Java Optional具有正确的.map
和.flatMap
,它们可以像在Scala或其他任何语言中一样工作。 但是, Java使这些方法的签名比Scala的签名更加复杂。
换句话说,这与Scala中的以下内容相同:
请注意,我保持相同的泛型类型名称。
.flatMap
最糟糕。
在Scala中,我们写道:
在两种语言中,我们都可以使用.get()
从Optional中提取值,但是不建议执行此操作,因为这可能会在两种语言中都以异常结束。 为了避免这种情况, Java和Scala采用了不同的方法。
在Java中,如果包装的值为null
则需要使用.orElse
提供默认值。
在Scala中,我们使用.getOrElse
我们可以看到,尽管Scala更简洁地介绍了如何创建Optional值以及如何避免出现空问题,但两种方法都是相似的。
还有一点Java是简短的, Java Optional是不可折叠的 。
每次在某个点将值放入可选值内时,我们都想知道其中具有什么样的值。 它是null还是只是一个常规值?
Java再次选择冗长,不太方便的路径。
因为Scala Option是可折叠的,所以我们可以用更优雅的方式做到这一点。 让我们看看如何。
Scala中的.fold
签名如下:
请注意, ifEmpty: => B
与 Java中的 Supplier<B>
相同 。
所以问题是为什么他们没有在Java Optional中添加.fold
?
仅出于教育目的,让我们自己用Java创建一个FoldableOptional ,看看实现.fold
有多么容易。
正如我们在此处看到的,鉴于Java中有限的工具箱, .fold
实现不可能更简单。 仍然非常直截了当。
结论
尽管Java语言在最近几年中一直在发展,但它仍然远远落后于Scala等其他语言,尤其是在功能方面。 令人印象深刻的是, Scala如何在整个库中以稳定的一致性维护相同的API。 甚至开源库和项目在所有方面都使用相同的标准。 另一方面, Java朝着更好的Java (如果确实存在)采取了正确的步骤,但是还有很长的路要走。 同时,我们必须继续使用手头的工具来完成日常工作,因此,在继续改进它的同时,我们要善用它。
From: https://hackernoon.com/java-optional-is-complicated-d6dc5c061e57