Java 8引入级简单不是返回NULL

Java 8引入级。简单地说,不是返回NULL,然后检查NULL,而是返回Optional实例,该实例可以有值集,也可以没有值集。这样你就不会失败NullPointerException.

我不会讨论Optional类型将完全消除NPEs(它不会)。相反,我将从不同的角度来讨论-API设计。除了Java的可选性之外,我还将展示番石榴的可选性和Scala的可选性Option比较它们。

正如约书亚·布洛赫所建议的那样,API应该尽可能小,但不要变小。API的概念权重应该最小化,如果您想知道是否在API中包含某些内容,那么您应该忽略它。API应该易于使用,很难误用,理想情况下应该有一种(或两种)主要的使用模式。可选类型是必须做出所有这些选择的一个很好的例子。

它的默认用法是什么?您将获得一个可选类型,并且只希望在存在值集的情况下执行某些代码。与NULL相比,您显然可以做到这一点,但您通常会忘记这一点,而可选类型迫使您认识到,这个值实际上可以被取消设置。第二个重要用例是,如果没有设置默认值,则可以轻松地提供默认值。

让我们先从三个中最糟糕的开始(在我看来,这个类似乎为您提供了许多功能。但是,对于Scala来说,使用类有很多不同的方法,其中没有一个比其他方法更好。对我来说,这个案子中最糟糕的决定是Option(隐式)可转换为Iterable。对于非Scala开发人员,让我们假设它是Iterable。但它只能有一个或零个元素。因此,为了实现我们的默认和最常见的用例,我们有以下选项:

  • 使用祈使式if (option.nonEmpty) {option.get.doSomething()}
  • 使用.foreach – option.foreach(v => v.doSomething)
  • 使用foreach循环(与上面不同):for (value <- option) {value.doSomething()}
  • 使用a表示理解(用于.屈服)(与上述两种方法不同)
  • 使用模式匹配-case Somecase None
  • 使用地图、折叠、收集等-这使过程更进一步-不仅得到了值,而且还应用了一些功能。

因此,从可选类型的基本概念来看,我们有一个具有数十个方法的类。这个API的概念权重是巨大的。显然没有首选的方法来处理最常见的情况,事实上,许多Scala开发人员喜欢的方法使用某种形式的foreach,当您知道最多只有一个值时,这听起来有点奇怪。

https://bbs.hupu.com/52123540.html

现在让我们继续我的第二名候选人-Jav您只有两种方法来使用它--带if-

子句的命令式检查和ifPresent(function)方法,其中提供了一个在有值时处理代码的函数。您还有两个重载的方法来提供默认值(第二个用例)。我不喜欢的是mapflatMapfilter方法在那里。它们是有用的,就像上面的Scala一样,但是可以忽略它们(它们的使用可以单独处理,几乎没有额外的细节),或者可以简化为一个函数映射。它与PlatMap有一个细微的区别,过滤单个元素并不是最有用的事情,此外,您可以使用map函数来实现这一点。

https://www.douban.com/note/826289074/

我知道,到现在为止,您可能已经准备好问(愤怒地),您将如何编写非常简洁的代码,而不具备折叠、收集、平面地图和过滤器的能力。在使用给定的可选类型执行操作后返回另一个可选类型是第三个用例,这对于长方法非常重要。它比其他两种都不常见,所以应该少注意它。理想情况下,一种方法就足够了--所有其他的子用例都可以在map函数本身中处理。

所以我们找到赢家--番石只有处理第一个用例的必要方法(因为它是为缺乏一流功能的Java版本开发的)。上面的第二和第三用例有尽可能少的方法(ortransform(..))。轻量级API,可以实现几乎相同的事情,在相同数量的代码。

事实上,为主用例提供一种功能方法--用例并不一定是好的--拥有可选类型的意义在于不能在功能上使用它--关键是要意识到值可能不存在。我不是说要在Scala和Java 8中去掉它,但是也许.isPresent().get()可以重新考虑。

底线是-很难设计API。即使是作为可选类型的简单事物,也有许多方面需要考虑主要和次要的美国案例,以及是否需要方便的方法,或者它们给API增加了不必要的复杂性,而是可以以一种不同的(不一定更冗长)的方式来处理。

最后,当您可能返回NULL时,请使用可选类型--NPEs很容易调试和修复,但很容易丢失,并且可能发生在错误的时刻。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值