写点什么

什么! 你还在使用 if (xxx != null) 做 NullPointerException 判断?

用户头像
刘超
关注
发布于: 2020 年 10 月 24 日
什么! 你还在使用 if (xxx != null)做NullPointerException判断?

如果有这样一个嵌套对象User,嵌套了用户的地址Address,此时我们要获取地址中的邮政编码的值,通常我们会采用以下代码编写获取该值:

String postalCode = user.getAddress().getPostalCode().toUpperCase();



但在以上代码中,只要任意一个对象的值为NULL时,都可能导致NullPointerException异常。如果我们需要确保不触发异常,就需要在访问每一个值之前,对其进行NULL值检查:

if (user != null) {
Address address = user.getAddress();
if (address != null) {
String postalCode = address.getPostalCode();
if (postalCode != null) {
postalCode = postalCode .toUpperCase();
}
}
}

 

但这样的代码很容易就变得冗长了,一次取值三次判断NULL值。那有没有什么更简洁的代码可以优化此类操作呢?

 

在Java 8.0之后,新增了一个工具类Optional,Optional类封装了一些方法,包括判断NULL值方法,主要用来解决空指针异常(NullPointerException)问题,Optional结合函数编程可以优化以上多层NULL值判断代码。在优化以上代码之前,先让我们来了解下Optional类。

 

我们先通过一个简单判断一个字符串是否为空的例子来了解下Optional类:

Optional<String> str = Optional.of("halo");if (str.isPresent()) {
System.out.println(str.get());
}

 

以上代码中,Optional类中of方法用来实例化,isPresent方法则判断值是否为NULL。除此之外,我们再了解Optional工具类中的其他几个主要方法。

 

ofNullable

为指定的值创建一个Optional,如果指定的值为null,则返回一个空的Optional。可为空的Optional

// 下面创建了一个不包含任何值的Optional实例
// 输出
Optional.emptyOptional empty = Optional.ofNullable(null);



map

如果有值,则对其执行调用mapping函数得到返回值。如果返回值不为null,则创建包含mapping返回值的Optional作为map方法返回值,否则返回空Optional。

Optional<String> username = Optional.of("test");
Optional<String> upperName = username.map((value) -> value.toUpperCase());

 

flatMap

如果有值,为其执行mapping函数返回Optional类型返回值,否则返回空Optional。flatMap与map(Funtion)方法类似,区别在于flatMap中的mapper返回值必须是Optional。调用结束时,flatMap不会对结果用Optional封装。

Optional<String> username = Optional.of("test");
Optional<String> upperName = username.flatMap((value) -> Optional.of(value.toUpperCase()));



orElse

如果有值则将其返回,否则返回指定的其它值。

Optional empty = Optional.ofNullable(null);
Optional<String> username = Optional.of("test");
System.out.println(empty.orElse("There is no value present!"));// 输出:There is no value present!System.out.println(username.orElse("There is some value!")); // 输出:test

 

通过以上例子,我们可以使用Optional类将最开始的复杂代码简化成以下一行代码:



String result = Optional.ofNullable(user)
.flatMap(u -> u.getAddress())
.map(a -> a.getPostalCode())
.orElse("");

 

上面的代码可通过方法引用(method references)做进一步精简:

tring result = Optional.ofNullable(user)
.flatMap(User::getAddress)
.map(Address::getPostalCode)
.orElse("");





发布于: 2020 年 10 月 24 日阅读数: 29
用户头像

刘超

关注

还未添加个人签名 2018.09.08 加入

一线互联网码农,极客时间《Java性能优化实战》作者

评论

发布
暂无评论
什么! 你还在使用 if (xxx != null)做NullPointerException判断?