Optional
到目前為止,臭名昭著的空指針異常是導致Java應用程序失敗的最常見原因。以前,為了解決空指針異常,Google公司著名的Guava項目引入了Optional類,Guava通過使用檢查空值的方式來防止代碼污染,它鼓勵程序員寫更干凈的代碼。受到Google Guava的啟發,Optional類已經成為Java 8類庫的一部分。
成都創新互聯是一家集網站建設,鐵東企業網站建設,鐵東品牌網站建設,網站定制,鐵東網站建設報價,網絡營銷,網絡優化,鐵東網站推廣為一體的創新建站企業,幫助傳統企業提升企業形象加強企業競爭力。可充分滿足這一群體相比中小企業更為豐富、高端、多元的互聯網需求。同時我們時刻保持專業、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們為更多的企業打造出實用型網站。
二、Optional類是什么?
Optional 類(java.util.Optional) 是一個容器類,它可以保存類型T的值,代表這個值存在。或者僅僅保存null,表示這個值不存在。原來用 null 表示一個值不存在,現在 Optional 可以更好的表達這個概念。并且可以避免空指針異常。
Optional提供很多有用的方法,這樣我們就不用顯式進行空值檢測。
三、Optional類用法
如果值存在則isPresent()方法會返回true,調用get()方法會返回該對象。
如果值不存在則isPresent()方法會返回false,調用get()方法會NPE。
創建Optional類對象的方法:
判斷Optional容器中是否包含對象:
boolean isPresent() :判斷是否包含對象
void ifPresent(Consumer super T>consumer) :如果有值,就執行Consumer接口的實現代碼,并且該值會作為參數傳給它。
獲取Optional容器的對象:
T get():如果調用對象包含值,返回該值,否則拋異常
T orElse(T other):如果有值則將其返回,否則返回指定的other對象。
T orElseGet(Supplier extends T>other) :如果有值則將其返回,否則返回由Supplier接口實現提供的對象。
T orElseThrow(Supplier extends X>exceptionSupplier) :如果有值則將其返回,否則拋出由Supplier接口實現提供的異常。
過濾:
-Optional filter(Predicate super predicate) :如果值存在,并且這個值匹配給定的
predicate,返回一個Optional用以描述這個值,否則返回一個空的Optional。
四、代碼示例
@AllArgsConstructor
@NoArgsConstructor
class Student {private String name;
private Integer age;
}
//1、創建Optional類
public void test1() {// 聲明一個空Optional
Optional
flatMap代碼示例: flatMap跟map是一樣的只不過他返回的是optional對象。map實際上就是用的Function函數,Function函數是有兩個參數的,第一個是入參數據類型,第二個是返回數據類型。Function函數作用就是傳入一個對象,然后返回一個對象,返回的對象類型可以自己設置。
T 就是代表實例的泛型數據類型,就是誰調用的 入參 必須跟調用者泛型的數據類型一樣。
U 就是自己說了算,調用完map之后返回什么數據類型,那么U就設置什么
public static OptionalstringToInt(String s) { try { return Optional.of(Integer.parseInt(s));
} catch (NumberFormatException e) { e.printStackTrace();
return Optional.empty();
}
}
Optional.ofNullable(props.getProperty(name))
.flatMap(OptionalUtils::stringToInt)
.filter(i ->i>0)
.orElse(0);
五、什么場景用Optional?
//1、場景一
PatientInfo patientInfo = patientInfoDao.getPatientInfoById(consultOrder.getPatientId());
if (patientInfo != null) {consultInfoResp.setPatientHead(patientInfo.getHead());
}
// 使用Optional 和函數式編程,一行搞定,而且像說話一樣
Optional.ofNullable(patientInfo).ifPresent(p ->consultInfoResp.setPatientHead(p.getHead()));
//2、場景二
public void test1() throws Exception {Student student = new Student(null, 3);
if (student == null || isEmpty(student.getName())) {throw new Exception();
}
String name = student.getName();
// 業務省略...
// 使用Optional改造
Optional.ofNullable(student).filter(s ->!isEmpty(s.getName())).orElseThrow(() ->new Exception());
}
public static boolean isEmpty(CharSequence str) {return str == null || str.length() == 0;
}
//3、場景三
public static String getChampionName(Competition comp) throws IllegalArgumentException {if (comp != null) {CompResult result = comp.getResult();
if (result != null) {User champion = result.getChampion();
if (champion != null) {return champion.getName();
}
}
}
throw new IllegalArgumentException("The value of param comp isn't available.");
}
//這個在開發中是很常見的一種邏輯。去判讀傳進來的參數時候為空,或者是從數據庫中獲取的對象。由于某些原因,我們不能很流程的直接這樣寫。
comp.getResult().getChampion().getName()
//上面的寫法用Optional改寫:
public static String getChampionName(Competition comp) throws IllegalArgumentException {return Optional.ofNullable(comp)
.map(Competition::getResult) // 相當于c ->c.getResult(),下同
.map(CompResult::getChampion)
.map(User::getName)
.orElseThrow(()->new IllegalArgumentException("The value of param comp isn't available."));
}
4、場景四
//類型之間的轉換,并且當沒有值的時候返回一個默認值
int timeout = Optional.ofNullable(redisProperties.getTimeout())
.map(x ->Long.valueOf(x.toMillis()).intValue())
.orElse(10000);
你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧
當前標題:Optiona--筆記-創新互聯
本文路徑:http://m.kartarina.com/article32/dcpesc.html
成都網站建設公司_創新互聯,為您提供標簽優化、關鍵詞優化、手機網站建設、微信公眾號、網站改版、網站設計
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯