昨日書いたダメなコード
ヒドイコードを書いたので忘れないようにメモっておく(忘れないとは言ってない)
前提
- 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> が与えられたメソッドでのとりまわしなので、どう書けば…のところのようにキレイに書けたかどうかは自信ない