ヒドイコードを書いたので忘れないようにメモっておく(忘れないとは言ってない)
前提
- Java7
- guava18.0 使用
やりたいこと
Optional
の中の値に対して filter
して isPresent
の結果がほしい
書いたコード
例: Optional<Integer>
に対して value > 0
の filter
をかける
final Optional<Integer> object = ...; final boolean result = object.transform(new Function<Integer, Optional<Integer>>() { @Override public Optional<Integer> apply(final Integer value) { if (value > 0) { return Optional.of(value); } else { return Optional.absent(); } } }).or(new Supplier<Optional<Integer>>() { @Override public Optional<Integer> get() { return Optional.absent(); } }).isPresent();
どう書けば読めるコードになったか
final Optional<Integer> object = ...; final boolean result = object.isPresent() && object.get() > 0;
Java8なら
final Optional<Integer> object = ...; final boolean result = object.filter(v -> v > 0).isPresent();
Java8での書き方に慣れすぎているがゆえに、 filter
/flatMap
のない guava の Optional
の制限プレーはなかなか厳しい…あと問題は簡単のために value > 0
みたいになっているけど、実際は Predicate<T>
が与えられたメソッドでのとりまわしなので、どう書けば…のところのようにキレイに書けたかどうかは自信ない