Optional<T> 類(java.util.Optional) 是一個(gè)容器類,代表一個(gè)值存在或不存在,原來用 null 表示一個(gè)值不存在,現(xiàn)在 Optional 可以更好的表達(dá)這個(gè)概念。并且可以避免空指針異常。
常用方法:
1. Optional.of(T t) : 創(chuàng)建一個(gè) Optional 實(shí)例
@Test
public void test1(){
Optional<Employee> op = Optional.of(new Employee());
System.out.println(op.get());
}
2. Optional.empty() : 創(chuàng)建一個(gè)空的 Optional 實(shí)例
@Test
public void test2(){
Optional<Object> op = Optional.empty();
System.out.println(op.get());
}
測(cè)試發(fā)現(xiàn)也報(bào)錯(cuò)了,但是相比于原來的空指針異常,使用Optional可以讓我們更快速的定位到問題
3. Optional.ofNullable(T t):若 t 不為 null,創(chuàng)建 Optional 實(shí)例,否則創(chuàng)建空實(shí)例
Optional<Employee> op = Optional.ofNullable(new Employee());
Optional<Employee> op1 = Optional.ofNullable(null);
4. isPresent() : 判斷是否包含值
Optional<Employee> op1 = Optional.ofNullable(null);
if (op1.isPresent()) {
System.out.println(op1.get());
}
5. orElse(T t) : 如果調(diào)用對(duì)象包含值,返回該值,否則返回t
Optional<Employee> op1 = Optional.ofNullable(null);
Employee emp = op1.orElse(new Employee("張三", 18, 888.88, FREE));
System.out.println(emp);
6. orElseGet(Supplier s) :如果調(diào)用對(duì)象包含值,返回該值,否則返回 s 獲取的值
Optional<Employee> op1 = Optional.ofNullable(null);
Employee employee = op1.orElseGet(Employee::new);
System.out.println(employee);
7. map(Function f): 如果有值對(duì)其處理,并返回處理后的Optional,否則返回Optional.empty()
Optional<Employee> op = Optional.ofNullable(new Employee("張三", 18, 888.88, FREE));
Optional<String> str = op.map((e) -> e.getName());
System.out.println(str);
8. flatMap(Function mapper):與 map 類似,要求返回值必須是Optional
Optional<Employee> op = Optional.ofNullable(new Employee("張三", 18, 888.88, FREE));
Optional<String> str2 = op.flatMap((e) -> Optional.of(e.getName()));//flatMap中必須將返回值封裝成Optional
System.out.println(str2.get());
使用案例:獲取男人心中女神的名字
創(chuàng)建一個(gè)Man類:
public class Man {
private Godness godness;
public Man() {
}
public Man(Godness godness) {
this.godness = godness;
}
public Godness getGodness() {
return godness;
}
public void setGodness(Godness godness) {
this.godness = godness;
}
}
創(chuàng)建一個(gè)女神類:
public class Godness {
private String name;
public Godness() {
}
public Godness(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
獲取男人心中女神名字的方法:
public String getGodnessName(Man man){
// return man.getGodness().getName();//這樣寫可能發(fā)生空指針異常
//如果還有更復(fù)雜的業(yè)務(wù)判斷非常麻煩
if (man != null) {
Godness gn = man.getGodness();
if (gn != null) {
return gn.getName();
}
}
return "xx";
}
代碼中已經(jīng)說明了可能存在的問題。如果用Java8怎么處理呢?
新建一個(gè)男人類:
public class NewMan {
//將那些可能有可能沒有的值封裝到Optional中
private Optional<Godness> godness = Optional.empty();
public NewMan() {
}
public NewMan(Optional<Godness> godness) {
this.godness = godness;
}
public Optional<Godness> getGodness() {
return godness;
}
public void setGodness(Optional<Godness> godness) {
this.godness = godness;
}
}
對(duì)方法進(jìn)行修改:
public String getGodnessName2(Optional<NewMan> man){
return man.orElse(new NewMan()).getGodness().orElse(new Godness("xx")).getName();
}