mike-neckのブログ

Java or Groovy or Swift or Golang

昨日書いたダメなコード

ヒドイコードを書いたので忘れないようにメモっておく(忘れないとは言ってない)

前提

  • Java7
  • guava18.0 使用

やりたいこと

Optional の中の値に対して filter して isPresent の結果がほしい

書いたコード

例: Optional<Integer> に対して value > 0filter をかける

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> が与えられたメソッドでのとりまわしなので、どう書けば…のところのようにキレイに書けたかどうかは自信ない