江头未是风波恶,别有人间行路难!
——辛弃疾《鹧鸪天》
## JDK8新特性--Optional
1. Optional简介
- 到目前为止,臭名昭著的空指针异常是导致Java应用程序失败的最常见原因。以前,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guava通过使用检查空值的方式来防止代码污染,它鼓励程序员写更干净的代码。
受到Google Guava的启发,Optional类已经成为JDK8类库的一部分。
Optional<T> 类(java.util.Optional) 是一个容器类,它可以保存类型T的值,代表这个值存在。
或者仅仅保存null,表示这个值不存在。原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。==并且可以避免空指针异常。==
Optional类的Javadoc描述如下:这是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
2. Optional常用方法
Optional提供很多有用的方法,这样我们就不用显式进行空值检测。
2.1 创建Optional 类对象的方法
Optional.of(T t)
: 创建一个 Optional 实例,t必须非空;
- Optional.empty() : 创建一个空的 Optional 实例
Optional.ofNullable(T t)
:t可以为null
2.2 判断Optional 容器中是否包含对象
-
boolean isPresent()
: 判断是否包含对象
void ifPresent(Consumer<? super T> consumer)
:如果有值,就执行Consumer接口的实现代码,并且该值会作为参数传给它。
2.3 获取Optional 容器的对象:
-
T get():
如果调用对象包含值,返回该值,否则抛异常
T orElse(T other) :
如果有值则将其返回,否则返回指定的other对象。
-
T orElseGet(Supplier<? extends T> other) :
如果有值则将其返回,否则返回由Supplier接口实现提供的对象。
T orElseThrow(Supplier<? extends X> exceptionSupplier)
: 如果有值则将其返回,否则抛出由Supplier接口实现提供的异常。
3. 测试方法
3.1 数据准备
Girl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| public class Girl {
private String name; public Girl() { } public Girl(String name) { this.name = name; } public String getName() { return name; }
public void setName(String name) { this.name = name; }
@Override public String toString() { return "Girl{" + "name='" + name + '\'' + '}'; } }
|
Boy
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| public class Boy { private Girl girl;
public Boy() { }
public Boy(Girl girl) { this.girl = girl; } public Girl getGirl() { return girl; }
public void setGirl(Girl girl) { this.girl = girl; } @Override public String toString() { return "Boy{" + "girl=" + girl + '}'; } }
|
3.2 OptionalTest
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
|
public class OptionalTest {
@Test public void test1() { Girl girl = new Girl();
Optional<Girl> optionalGirl1 = Optional.of(girl); System.out.println("optionalGirl1 = " + optionalGirl1);
girl = null; Optional<Girl> optionalGirl2 = Optional.ofNullable(girl); System.out.println("optionalGirl2 = " + optionalGirl2);
Girl girl1 = optionalGirl2.orElse(new Girl("赵丽颖")); System.out.println(girl1); }
public String getGirlName(Boy boy) { return boy.getGirl().getName(); }
@Test public void test2() { Boy boy = new Boy(); boy = null; String girlName = getGirlName(boy); System.out.println(girlName);
}
public String getGirlName1(Boy boy) { if (boy != null) { Girl girl = boy.getGirl(); if (girl != null) { return girl.getName(); } } return null;
}
@Test public void test3() { Boy boy = new Boy(); boy = null; String girlName = getGirlName1(boy); System.out.println(girlName);
}
public String getGirlName2(Boy boy) {
Optional<Boy> boyOptional = Optional.ofNullable(boy);
Boy boy1 = boyOptional.orElse(new Boy(new Girl("迪丽热巴")));
Girl girl = boy1.getGirl();
Optional<Girl> girlOptional = Optional.ofNullable(girl);
Girl girl1 = girlOptional.orElse(new Girl("古力娜扎"));
return girl1.getName(); }
@Test public void test4() { Boy boy = null; boy = new Boy(); String girlName = getGirlName2(boy); System.out.println(girlName);
}
}
|
☆