介紹
Optional<T>類是一個(gè)容器類徒仓,代表一個(gè)值存在或不存在,原來用null表示一個(gè)值不存在誊垢,現(xiàn)在Optional可以更好地表達(dá)這個(gè)概念掉弛,并且可以避免空指針異常。
常用API
Optional.of(T t):創(chuàng)建一個(gè)Optional實(shí)例喂走,若為null殃饿,則會(huì)引起空指針
Optional.empty():創(chuàng)建一個(gè)空的Optional實(shí)例
Optional.ofNullable(T t):若t不為null,創(chuàng)建Optional實(shí)例芋肠,否則創(chuàng)建空實(shí)例
isPresent():判斷是否包含值
orElse(T t):如果調(diào)用對(duì)象包含值乎芳,返回該值,否則返回t
orElseGet(Supplier s):如果調(diào)用對(duì)象包含值帖池,返回該值奈惑,否則返回s獲取的值
map(Function f):如果有值對(duì)其處理,并返回處理后的Optional睡汹,否則返回Optional.empty()
flatMap(Function mapper):與map類似肴甸,要求返回值必須是Optional
package com.chentongwei.java8.day06;
import java.util.Optional;
import org.junit.Test;
import com.chentongwei.java8.day05.Employee;
/**
* 測試Optional
*
* @author TongWei.Chen
* @date 2017年4月3日13:25:37
*/
public class TestOptional {
//of
@Test
public void test1() {
Optional<Employee> op = Optional.of(new Employee());
//正常輸出
System.out.println(op.get());
Optional<Employee> op1 = Optional.of(null);
//空指針異常
System.out.println(op1.get());
}
//empty
@Test
public void test2() {
Optional<Employee> op = Optional.empty();
//java.util.NoSuchElementException
//不會(huì)出現(xiàn)空指針異常
System.out.println(op.get());
}
//ofNullable orElse orElseGet
@Test
public void test3() {
Optional<Employee> op = Optional.ofNullable(new Employee());
//如果有元素,不是空或null
if(op.isPresent()) {
System.out.println(op.get());
}
Employee emp = op.orElse(new Employee("張三"));
System.out.println(emp);
//與orElse區(qū)別在于他接收一個(gè)函數(shù)式接口囚巴,可以寫自己邏輯原在,比如if true
//返回A對(duì)象,else 返回B對(duì)象
Employee emp2 = op.orElseGet(() -> new Employee());
System.out.println(emp2);
}
//map flatMap
@Test
public void test4(){
Optional<Employee> op = Optional.of(new Employee(101, "張三", 18, 9999.99));
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());
}
//需求:獲取一個(gè)男人心中女神的名字
public String getGodnessName(Man man){
//防止出現(xiàn)空指針異常文兢,需要各種判斷
if(man != null){
Godness g = man.getGod();
if(g != null){
return g.getName();
}
}
return "蒼老師";
}
@Test
public void test5() {
Man man = new Man();
String name = getGodnessName(man);
System.out.println(name);
}
@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();
}
}
若有興趣,歡迎來加入群焕檬,【Java初學(xué)者學(xué)習(xí)交流群】:458430385姆坚,此群有Java開發(fā)人員、UI設(shè)計(jì)人員和前端工程師实愚。有問必答兼呵,共同探討學(xué)習(xí),一起進(jìn)步腊敲!
歡迎關(guān)注我的微信公眾號(hào)【Java碼農(nóng)社區(qū)】击喂,會(huì)定時(shí)推送各種干貨: