標籤:java8 catch 通過 element java 8 code str 獲得 not
1.Optional:
return user.map(u -> u.getOrders()).orElse(Collections.emptyList())//上面避免了我們類似 java 8 之前的做法if(user.isPresent()){ return user.get().getOrders();}else{ return Collections.emptyList();}map 是可能無限級聯的,比如再深層次,獲得使用者名稱的大寫形式return user.map(u -> u.getUsername()) .map(name -> name.toUpperCase()) .orElse(null) ;//這要是以前,寫法如下:User user = ....if( user != null ){ String name = user.getUsername(); if(name != null){ return name.toUpperCase(); }else{ return null; }}else{ return null;}使用 Optional 時盡量不直接調用 Optional.get() 方法,Optional.isPresent()
更應該被視為一個私人方法,應依賴於其他像 Optional.orElse() , Optional.orElseGet() , Optional.map() 等這樣的方法。
public static void main(String[] args) { //建立Optional執行個體,也可以通過方法傳回值得到。 Optional<String> name = Optional.of("Sanaulla"); //建立沒有值的Optional執行個體,例如值為‘null‘ Optional empty = Optional.ofNullable(null); //isPresent方法用來檢查Optional執行個體是否有值。 if (name.isPresent()) { //調用get()返回Optional值。 System.out.println(name.get()); } try { //在Optional執行個體上調用get()拋出NoSuchElementException。 System.out.println(empty.get()); } catch (NoSuchElementException ex) { System.out.println(ex.getMessage()); } //ifPresent方法接受lambda運算式參數。 //如果Optional值不為空白,lambda運算式會處理並在其上執行操作。 name.ifPresent((value) -> { System.out.println("The length of the value is: " + value.length()); }); //如果有值orElse方法會返回Optional執行個體,否則返回傳入的錯誤資訊。 System.out.println(empty.orElse("There is no value present!")); System.out.println(name.orElse("There is some value!")); //orElseGet與orElse類似,區別在於傳入的預設值。 //orElseGet接受lambda運算式產生預設值。 System.out.println(empty.orElseGet(() -> "Default Value")); System.out.println(name.orElseGet(() -> "Default Value")); try { //orElseThrow與orElse方法類似,區別在於傳回值。 //orElseThrow拋出由傳入的lambda運算式/方法產生異常。 empty.orElseThrow(ValueAbsentException::new); } catch (Throwable ex) { System.out.println(ex.getMessage()); } //map方法通過傳入的lambda運算式修改Optonal執行個體預設值。 //lambda運算式傳回值會封裝為Optional執行個體。 Optional<String> upperName = name.map((value) -> value.toUpperCase()); System.out.println(upperName.orElse("No value found")); //flatMap與map(Funtion)非常相似,區別在於lambda運算式的傳回值。 //map方法的lambda運算式傳回值可以是任何類型,但是傳回值會封裝成Optional執行個體。 //但是flatMap方法的lambda傳回值總是Optional類型。 upperName = name.flatMap((value) -> Optional.of(value.toUpperCase())); System.out.println(upperName.orElse("No value found")); //filter方法檢查Optiona值是否滿足給定條件。 //如果滿足返回Optional執行個體值,否則返回空Optional。 Optional<String> longName = name.filter((value) -> value.length() > 6); System.out.println(longName.orElse("The name is less than 6 characters")); //另一個樣本,Optional值不滿足給定條件。 Optional<String> anotherName = Optional.of("Sana"); Optional<String> shortName = anotherName.filter((value) -> value.length() > 6); System.out.println(shortName.orElse("The name is less than 6 characters")); }
java8:(Optional)