SlideShare a Scribd company logo
null使ったら負け東京版
null使ったら負け東京版
null書いたら負け
● Streamはコーディング規約で禁止でもいい
● Date and Timeはよくわからない
null使ったら負け東京版
null使ったら負け東京版
null使ったら負け東京版
Optionalとは
● java.util.Optional<T>
● ScalaでいうOption
● HaskellでいうMaybe
● 値をもつかもたないか
Optionalを用意する
● 値がある
Optional.of(str)
– nullを渡すとぬるぽ
● 値がない
Optional.empty()
● 値があるかどうかわからない
Optional.ofNullable(str)
値があるかどうか判定する
if(ostr.isPresent()){
System.out.println(ostr.get());
}
● isPresent
別の値に変換する
● map
Optional<String> ostr = Optional.of(str);
ostr.map(String::length)
.ifPresent(System.out::println);
モナド!
● nullのある世界とない世界の分離
nullを使っていいところ悪いところ
● ローカル変数 ○
● 引数 △
● フィールド ×
● 戻り値 ×
Java8のほかの作法
● Streamでの注意
● メソッド参照とラムダの使い分け
● 遅延実行をいかす
● Mapを活用する
● 制御構造を自作する
Streamでの注意
● 副作用に気をつける
副作用に気をつける
● 副作用を使う基準
– 中間操作 ×
– 終端操作
● reduce △
● forEach ○
遅延実行をいかす
● 値が使われる可能性の低い引数の構築に時間がか
かるとき
● Logger
● Optional
– Optional#orElseGet
– Optional#orElseThrow
logger.debug(bigObject.toString());
logger.fine(() -> bigObject.toString());
Mapを活用する
● Map<?, LIst<?>>
● メモ化
Map<?, List<?>>
● 追加
– Map#computeIfAbsent
● 削除
– Map#computeIfPresent
modifiedTuples.computeIfPresent(mt.oldtuple.rid,
(rid, list) -> {
list.remove(mt);
return list.isEmpty() ? null : list;
});
modifiedTuples.computeIfAbsent(mt.oldtuple.rid,
rid -> new LinkedList()).push(mt);
メモ化
● Map#computeIfAbsent
– 値があればその値、なければ計算を行って結果を
Mapに格納しつつ返す。
制御構造を自作する
● カスタムwith
● カスタム分岐
● カスタムループ
カスタムwith
● try-with-resource
public static void withTran(Transaction tx, Runnable proc){
try{
proc.run();
tx.commit();
}catch(Exception ex){
tx.rollback();
}
}
withTran(tx, () -> {
// Databaseアクセス!
});
カスタム分岐
● パターンマッチ
– 型安全なオブジェクトごとの操作と分解
http://d.hatena.ne.jp/nowokay/20131212#1386820115
カスタムループ
● forEach
● zip
zip
● ふたつのStreamをまとめる
Pairとzip
http://d.hatena.ne.jp/nowokay/20140321#1395371615
public static void main(String[] args) {
List<String> prefs = Arrays.asList("ほっかいどう", "ちば",
"とうきょう", "しが", "やまぐち",
"さが", "みやざき");
StreamUtils.zip(
IntStream.iterate(1, SUCC).boxed(),
prefs.stream().filter(s -> s.length() <= 2))
.forEach(p -> System.out.printf(
"%d:%s%n", p.left, p.right));
}
メソッド参照とラムダの使い分け
● メソッド参照は引数を隠す
● 読み解くのにコンテキスト理解が必要
– メソッドに渡すためのメソッド ○
– 引数ひとつのメソッド △
– 引数複数のメソッド ×
Java8の弱点
● 型推論が案外弱い
http://d.hatena.ne.jp/nowokay/20140107#1389093206

More Related Content

null使ったら負け東京版