首页 欧冠最新报道正文

兰陵王,巧用Optional脱节NullPointExcept的摧残-雷火电竞平台官网

admin 欧冠最新报道 2019-11-20 121 0
专心于Java范畴优质技能,欢迎重视

来着: javaadu , 作者:阿杜的国际

布景

在Java中,假如你测验对null做函数调用,就会引发NullPointerException(NPE),NPE是Java程序开发中的最典型的反常,关于Java开发者来说,不管你是初出茅庐的新人和还作业多年的老司机,NPE常常让他们翻车。为了防止NPE,他们会加许多if判别句子,使得代码的可读性变得很差。

从软件规划的视点来看,null自身是没有意义的语义,这是一种对缺失变量值的过错的建模。

从Java类型体系的视点看,null能够被赋值给任何类型的变量,并且不断被传递,知道最终谁也不知道它是从哪里引进的。

Optional的引进

Java规划者从Haskell和Scala中获取创意,在Java 8中引进了一个新的类 java.util.Optional。假如一个接口回来Optional,能够表明一个人或许有车也或许没有车,这个比简略的回来Car要更清晰,阅览代码的人不需求提前准备业务常识。

Optional的意图就在于此:经过类型体系让你的范畴模型中躲藏的常识显式地表现在你的代码中。

Optional的运用

上面这张表里列举了Optional的根底API,我这儿列举了一些运用的tips:

  • 你能够用ofNullable将一个或许为null的目标封装为Optional目标,然后获取值的时分运用orElse办法供给默认值;能够运用empty办法创立一个空的Optional目标;of办法一般不必,不过假如你知道某个值不或许为null,则能够用Optional封装该值,这样它一旦为null就会抛出反常。
  • 从某个目标中获取值是最常见的一种场景,这时分为了防止这个目标为null导致NPE,一般是运用if-then-else结构查看,假如运用Optional的话,则能够运用map办法来获取它封装的目标中某个字段的值。
  • 假如需求接连、层层递进的从某个目标链的结尾获取字段的值,则不能悉数运用map办法,需求先运用flatMap,最终再运用map办法;Optional中的map、flatMap和filter办法,在概念是与Stream中对应的办法都很相似,差异就在于Optional中的元素至多有一个,算是Stream的一种特别情况——一种特别的调集。
  • 不要运用ifPresent和get办法,它们本质上和不适用Optional目标之前的形式相同,都是臃肿的if-then-else判别句子;
  • 因为Optional无法序列化,所以在范畴模型中,无法将某个字段界说为Optional的,原因是:Optional的规划初衷仅仅是要支撑能回来Optional目标的语法,假如咱们期望在域模型中引进Optional,则能够用下面这种代替的办法:
  • 不要运用根底类型的Optional目标,原因是:根底类型的Optional目标不支撑map、flatMap和filter办法,而这些办法是Optional中十分强壮的办法。

实战事例

运用东西类办法改进或许抛出反常的API

Java办法处理反常成果的办法有两种:回来null(或过错码);抛出反常,例如:Integer.parseInt(String)这个办法——假如无法解析到对应的整型,该办法就抛出一个NumberFormationException,这种情况下咱们一般会运用try/catch句子处理反常情况。

一般咱们主张将try/catch块独自提取到一个办法中,在这儿运用Optional规划这个办法,代码如下。在开发中,能够测验构建一个OptionalUtility东西类,将这些杂乱的try/catch逻辑封装起来。

归纳事例

现在有个办法,是测验从一个特点映射中获取某个关键词对应的值,比如代码如下:

运用Optional的写法后,代码如下所示:

假如需求拜访的特点值不存在,Properites.getProperty(String)办法的回来值便是一个null,运用noNullable工厂办法就能够将该值转换为Optional目标;接下来,能够运用flatMap将一个Optional转换为Optional目标;最终运用filter过滤掉负数,然后就能够运用orElse获取特点值,假如拿不到则回来默认值0。

总结

运用Optional的思路和Stream相同,都是链式思路,跟数据库查询似的,表达力很强,并且省去了哪些杂乱的try/catch和if-then-else办法。在后面的开发中,能够运用Optional规划API,这样能够规划出更安全的接口和办法。

雷火电竞版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

最近发表

    雷火电竞平台官网_雷火竞猜_雷火电竞csgo

    http://www.koisoku.net/

    |

    Powered By

    使用手机软件扫描微信二维码

    关注我们可获取更多热点资讯

    雷火电竞出品