Weitere ähnliche Inhalte Ähnlich wie 如何用JDK8實作一個小型的關聯式資料庫系統 (12) 如何用JDK8實作一個小型的關聯式資料庫系統14. ● 生新的產 List
● 將List 中的資料處理後 生新的產 List
– fields 的 List
– 所有 執行值 eval 的方法
List<Value> result = new ArrayList<>();
for(Field f : fields){
result.add(eval(f));
}
15. ● 生新的產 List
● 用Stream
● 這種類似處理非常多
● 使用 Stream 可以減輕很多負擔
List<Value> result = fields.stream()
.map(f -> eval(f))
.collect(toList());
16. ●判斷List
● List 的所有元素是否都符合條件的判斷
– conditions 的 List
– 元素在使用 hasOr
– 所有true 的話就 return
boolean result = true;
for(Condition c : conditions){
if(!hasOr(c)) result = false;
}
if(result) return;
18. Optional
● 表示有沒有 的型別值
● Scala→Optiona、Haskell→Maybe
● 通常使用 null
– 忘記做 null 檢 →查 NullPointerException
– 從程式碼型別上根本就分辨不出來,變數有沒
有可能被指定成 null 的狀況
20. Optional 的使用方法
● 建立 Optional
– Optional.of(value)
– null 的時候, 會 生產 NullPointerException
– 參數不為 null 時才可以使用
● 不知道是不是值 null
– Optional.ofNullable(value)
● 表示沒有值
– Optional.empty()
21. 從 Optional 取得值1
● get()
– 沒有值,丟出 NoSuchElementException
– 請儘量不要這樣使用
● orElse(defaultValue)
– 沒有 時會回傳值 defaultValue
22. 從 Optional 取得值2
● orElseGet(() -> defualtValue)
– defaultValue 的計算可能會花一些時間
– 傳入一個型別為 Supplier
– 使用 lambda 式
– 沒有 的時候才會執行值
– 只有在需要時才執行的動作
● 延遲執行(Lazy Execution)
23. Optional 有 得時候才會想要執行某值
些動作
● 判斷有沒有值
● isPresent()
– 有 →值 true
– 沒有值(empty)→false
● 不是 Java 8 的風格
Optional<String> ostr = Optional.ofNullable(str);
if(ostr.isPresent()){
System.out.println(ostr.get().length());
}
24. Optional 有 得時候才會想要執行某值
些動作
● ifPresent(Consumer c)
● 只有在有 時會執行傳入的式值
● 參數的型別是Consumer
– 用 lambda 來寫
– 有 時才會執行值
Optional<String> ostr = Optional.ofNullable(str);
ostr.ifPresent(s -> {
System.out.println(s.length());
});
25. 轉換成其他值 值
● map(Function<T, U>)
– 傳入回傳普通 的值 lambda 式
– 回傳包著那個 得值 Optional
– null的時候,變成empty
– 不用擔心 NullPointerException
● flatMap(Function<T, Optional<U>)
– 傳入回傳Option的 lambda式
– 回傳剛剛的 Optional
Optional<String> ostr = Optional.ofNullable(str);
ostr
.map(String::length)
.ifPresent(System.out::println);
26. 當 符合條件才要處理值
● filter(Predicate<T>)
– 條件不符合會回傳 empty
Optional<String> ostr = Optional.ofNullable(str);
ostr
.map(String::length)
.filter(len -> len < 5)
.ifPresent(System.out::println);
27. map,filter,ifPresent
● 跟 map 還有 filter 之類的方法搭配處理時,非常有效果
● map・filter・ifPresent裡面
– 保證 不會是值 null
– 不用擔心NullPointerException
● 隔離有 null 的世界和沒有null 的世界
● Optional要多打一些字 (^^
– 可以讓人寫的比較安心
– 請記得會出現 null 時就要利用 Optional
29. Lombok
● http://projectlombok.org/
● 可以把一些 Java 很繁雜的程式碼減少
● Setter/Getter
– 可以用 IDE 幫我們 生產
– 看起來一長串很煩
– 改也很麻煩
class Foo{
String message;
public String getMessage(){
return message;
}
publilc void setMessage(String m){
this.message = m;
}
}
33. JParsec的例
● delete的語法定義
public static Parser<ASTDelete> delete(){
return Parsers.sequence(
terms.token("delete").next(terms.token("*").optional())
.next(terms.token("from")).next(identifier()),
where().optional(),
(id, w) -> new ASTDelete(id, Optional.ofNullable(w)));
}
35. 總結2
● Java8很方便
– 回不去Java7
● Optional應該多加利用
– Java8中如果出現 nullpointerexception 就太失
敗了
● Lombok
– 可以從又臭又長麻煩的程式碼中解脫
● JParsec
– 不知不覺的完成結構很大的語法定義,很有趣