java8:(Optional)
阿新 • • 發佈:2018-08-10
給定 ring 行操作 cep 使用 upper rac som 寫法
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)