加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 移动互联 > 正文

巧用Optional摆脱NullPointExcept的折磨

发布时间:2019-07-18 15:11:07 所属栏目:移动互联 来源:阿杜的世界
导读:配景 在Java中,假如你实行对null做函数挪用,就会激发NullPointerException(NPE),NPE是Java措施开拓中的最典范的非常,对付Java开拓者来说,无论你是初出茅庐的新人和还事变多年的老司机,NPE常常让他们翻车。为了停止NPE,他们会加许多if判定语句,使

配景

在Java中,假如你实行对null做函数挪用,就会激发NullPointerException(NPE),NPE是Java措施开拓中的最典范的非常,对付Java开拓者来说,无论你是初出茅庐的新人和还事变多年的老司机,NPE常常让他们翻车。为了停止NPE,他们会加许多if判定语句,使得代码的可读性变得很差。

从软件计划的角度来看,null自己是没故意义的语义,这是一种对缺失变量值的错误的建模。

从Java范例体系的角度看,null可以被赋值给任何范例的变量,而且不绝被转达,知道最后谁也不知道它是从那边引入的。

Optional的引入

Java计划者从Haskell和Scala中获取灵感,在Java 8中引入了一个新的类 java.util.Optional<T>。假如一个接口返回Optional,可以暗示一小我私人也许有车也也许没有车,这个比简朴的返回Car要更明晰,阅读代码的人不必要提前筹备营业常识。

Optional的目标就在于此:通过范例体系让你的规模模子中潜匿的常识显式地表此刻你的代码中。

Optional的行使

巧用Optional挣脱NullPointExcept的熬煎

上面这张内外罗列了Optional的基本API,我这里罗列了一些行使的tips:

  • 你可以用ofNullable将一个也许为null的工具封装为Optional工具,然后获取值的时辰行使orElse要领提供默认值;可以行使empty要领建设一个空的Optional工具;of要领一样平常不消,不外假如你知道某个值不行能为null,则可以用Optional封装该值,这样它一旦为null就会抛出非常。
巧用Optional挣脱NullPointExcept的熬煎
  • 从某个工具中获取值是最常见的一种场景,这时辰为了停止这个工具为null导致NPE,一样平常是行使if-then-else布局搜查,假如行使Optional的话,则可以行使map要领来获取它封装的工具中某个字段的值。
巧用Optional挣脱NullPointExcept的熬煎
  • 假如必要持续、层层递进的从某个工具链的结尾获取字段的值,则不能所有行使map要领,必要先行使flatMap,最后再行使map要领;Optional中的map、flatMap和filter要领,在观念是与Stream中对应的要领都很相同,区别就在于Optional中的元素至多有一个,算是Stream的一种非凡环境——一种非凡的荟萃。
巧用Optional挣脱NullPointExcept的熬煎
  • 不要行使ifPresent和get要领,它们本质上和不合用Optional工具之前的模式沟通,都是痴肥的if-then-else判定语句;
  • 因为Optional无法序列化,以是在规模模子中,无法将某个字段界说为Optional的,缘故起因是:Optional的计划初志仅仅是要支持能返回Optional工具的语法,假如我们但愿在域模子中引入Optional,则可以用下面这种更换的要领:
巧用Optional挣脱NullPointExcept的熬煎
  • 不要行使基本范例的Optional工具,缘故起因是:基本范例的Optional工具不支持map、flatMap和filter要领,而这些要领是Optional中很是强盛的要领。

拭魅战案例

行使器材类要领改善也许抛出非常的API

Java要领处理赏罚非常功效的方法有两种:返回null(或错误码);抛出非常,譬喻:Integer.parseInt(String)这个要领——假如无法理会到对应的整型,该要领就抛出一个NumberFormationException,这种环境下我们一样平常会行使try/catch语句处理赏罚非常环境。

一样平常我们提议将try/catch块单独提取到一个要领中,在这里行使Optional计划这个要领,代码如下。在开拓中,可以实行构建一个OptionalUtility器材类,将这些伟大的try/catch逻辑封装起来。

巧用Optional挣脱NullPointExcept的熬煎

综合案例

此刻有个要领,是实行从一个属性映射中获取某个要害词对应的值,例子代码如下:

巧用Optional挣脱NullPointExcept的熬煎

行使Optional的写法后,代码如下所示:

巧用Optional挣脱NullPointExcept的熬煎

假如必要会见的属性值不存在,Properites.getProperty(String)要领的返回值就是一个null,行使noNullable工场要领就可以将该值转换为Optional工具;接下来,可以行使flatMap将一个Optional<String>转换为Optional<Integer>工具;最后行使filter过滤掉负数,然后就可以行使orElse获取属性值,假如拿不到则返回默认值0。

总结

行使Optional的思绪和Stream沟通,都是链式思绪,跟数据库查询似的,表达力很强,并且省去了哪些伟大的try/catch和if-then-else要领。在后头的开拓中,可以行使Optional计划API,这样可以计划出更安详的接口和要领。

【编辑保举】

  1. 2019年用于JavaScript的6大呆板进修库
  2. 2019编程说话瞻望:Java 仍旧是就业需求最高的编程说话
  3. GitHub Trending被国人恒久“霸榜”,海外开拓者SAY NO
  4. Uber 开源研究对话体系 Plato,用于开拓和实习会话 AI
  5. PYPL 7 月榜单发布:Java 份额呈现降落趋势
【责任编辑:张燕妮 TEL:(010)68476606】
点赞 0

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读