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中提取值,但是不建议执行此操作,因为这可能会在两种语言中都以异常结束。 为了避免这种情况, JavaScala采用了不同的方法。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值