标签:为我 命令 tle getname extend syn 描述 set 封装
空指针异常一直是困扰Java程序员的问题,也是我们必须要考虑的。当业务代码中充满了if else判断null 的时候程序变得不再优雅,在Java8中提供了Optional类为我们解决NullPointerException。
我们先来看看这段代码有什么问题?
1
2
3
4
5
6
7
8
9
|
class User { String name; public String getName() { return name; } } public static String getUserName(User user){ return user.getName(); } |
这段代码看起来很正常,每个User都会有一个名字。所以调用getUserName方法会发生什么呢? 实际这是不健壮的程序代码,当User对象为null的时候会抛出一个空指针异常。
我们普遍的做法是通过判断user != null然后获取名称
1
2
3
4
5
6
|
public static String getUserName(User user){ if (user != null ){ return user.getName(); } return null ; } |
但是如果对象嵌套的层次比较深的时候这样的判断我们需要编写多少次呢?难以想象
使用Optional优化代码
1
2
3
4
|
public static String getUserNameByOptional(User user) { Optional<String> userName = Optional.ofNullable(user).map(User::getName); return userName.orElse( null ); } |
当user为null的时候我们设置UserName的值为null,否则返回getName的返回值,但此时不会抛出空指针。
在之前的代码片段中是我们最熟悉的命令式编程思维,写下的代码可以描述程序的执行逻辑,得到什么样的结果。 后面的这种方式是函数式思维方式,在函数式的思维方式里,结果比过程更重要,不需要关注执行的细节。程序的具体执行由编译器来决定。 这种情况下提高程序的性能是一个不容易的事情。
我们再次了解下Optional中的一些使用方法
创建 Optional 对象
你可以通过静态工厂方法Optional.empty,创建一个空的Optional对象:
1
|
Optional<User> emptyUser = Optional.empty(); |
创建一个非空值的Optional
1
|
Optional<User> userOptional = Optional.of(user); |
如果user是一个null,这段代码会立即抛出一个NullPointerException,而不是等到你试图访问user的属性值时才返回一个错误。
可接受null的Optional
1
|
Optional<User> ofNullOptional = Optional.ofNullable(user); |
使用静态工厂方法Optional.ofNullable,你可以创建一个允许null值的Optional对象。
如果user是null,那么得到的Optional对象就是个空对象,但不会让你导致空指针。
使用map从Optional对象中提取和转换值
1
2
|
Optional<User> ofNullOptional = Optional.ofNullable(user); Optional<String> userName = ofNullOptional.map(User::getName); |
这种操作就像我们之前在操作Stream是一样的,获取的只是User中的一个属性。
默认行为及解引用Optional对象
我们决定采用orElse方法读取这个变量的值,使用这种方式你还可以定义一个默认值, 遭遇空的Optional变量时,默认值会作为该方法的调用返回值。 Optional类提供了多种方法读取 Optional实例中的变量值。
当前除了这些Optional类也具备一些和Stream类似的API,我们先看看Optional类方法:
用Optional封装可能为null的值
目前我们写的大部分Java代码都会使用返回NULL的方式来表示不存在值,比如Map中通过Key获取值, 当不存在该值会返回一个null。 但是,正如我们之前介绍的,大多数情况下,你可能希望这些方法能返回一个Optional对象。 你无法修改这些方法的签名,但是你很容易用Optional对这些方法的返回值进行封装。
我们接着用Map做例子,假设你有一个Map<String, Object>类型的map,访问由key的值时, 如果map中没有与key关联的值,该次调用就会返回一个null。
1
|
Object value = map.get( "key" ); |
使用Optional封装map的返回值,你可以对这段代码进行优化。要达到这个目的有两种方式: 你可以使用笨拙的if-then-else判断语句,毫无疑问这种方式会增加代码的复杂度; 或者你可以采用Optional.ofNullable方法
1
|
Optional<Object> value = Optional.ofNullable(map.get( "key" )); |
每次你希望安全地对潜在为null的对象进行转换,将其替换为Optional对象时,都可以考虑使用这种方法。
今天七夕,祝天下有情人终成眷属!
标签:为我 命令 tle getname extend syn 描述 set 封装
原文地址:http://www.cnblogs.com/doit8791/p/7399495.html