Optional<T>
類(
java.util.Optional
) 是一個容器類,代表一個值存在或不存在。原來用
null
表示一個值不存在,現在
Optional
可以更好的表達這個概念。并且可以避免空指針異常(更早的發現空指針)。
常用方法
方法 | 描述 |
---|---|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 傳回空的 Optional 執行個體。 |
| 判斷其他對象是否等于 Optional。 |
| 如果值存在,并且這個值比對給定的 predicate,傳回一個Optional用以描述這個值,否則傳回一個空的Optional。 |
| 與 map 類似,要求傳回值必須是Optional |
| 如果在這個Optional中包含這個值,傳回值,否則抛出異常:NoSuchElementException |
| 傳回存在值的哈希碼,如果值不存在 傳回 0。 |
| 如果值存在則使用該值調用 consumer , 否則不做任何事情。 |
| 如果值存在則方法會傳回true,否則傳回 false。 |
| 如果有值對其處理,并傳回處理後的Optional,否則傳回 Optional.empty() |
| 傳回一個指定非null值的Optional。 |
| 如果為非空,傳回 Optional 描述的指定值,否則傳回空的 Optional。 |
| 如果存在該值,傳回值, 否則傳回 other。 |
| 如果存在該值,傳回值, 否則觸發 other,并傳回 other 調用的結果。 |
| 如果存在該值,傳回包含的值,否則抛出由 Supplier 繼承的異常 |
| 傳回一個Optional的非空字元串,用來調試 |
代碼示例
大家可以看一下這篇文章,寫的挺好:JAVA8之妙用Optional解決NPE問題
public class TestOptional {
@Test
public void test1() {
Optional<Employee> op = Optional.of(new Employee());
Employee emp = op.get();
System.out.println(emp);
}
@Test
public void test2() {
Optional<Employee> op = Optional.ofNullable(null);
System.out.println(op.get());
Optional<Employee> op2 = Optional.empty();
System.out.println(op2.get());
}
@Test
public void test3() {
Optional<Employee> op = Optional.ofNullable(null);
if (op.isPresent()) {
System.out.println(op.get());
}
Employee emp = op.orElse(new Employee("張三"));
System.out.println(emp);
Employee emp2 = op.orElseGet(() -> new Employee());
System.out.println(emp2);
}
@Test
public void test4() {
Optional<Employee> op = Optional.of(new Employee(, "張三", , ));
Optional<String> op2 = op.map(Employee::getName);
System.out.println(op2.get());
Optional<String> op3 = op.flatMap((e) -> Optional.of(e.getName()));
System.out.println(op3.get());
}
@Test
public void test5() {
Man man = new Man();
String name = getGodnessName(man);
System.out.println(name);
}
// 需求:擷取一個男人心中女神的名字
public String getGodnessName(Man man) {
if (man != null) {
Godness g = man.getGod();
if (g != null) {
return g.getName();
}
}
return "蒼老師";
}
// 運用 Optional的實體類
@Test
public void test6() {
Optional<Godness> godness = Optional.ofNullable(new Godness("林志玲"));
Optional<NewMan> op = Optional.ofNullable(new NewMan(godness));
String name = getGodnessName2(op);
System.out.println(name);
}
public String getGodnessName2(Optional<NewMan> man) {
return man.orElse(new NewMan()).getGodness().orElse(new Godness("蒼老師")).getName();
}
}
源碼位址:https://gitee.com/liupeifeng3514/JDK8_New_Features