アットウィキロゴ

FluentIterable.filterメソッド

流れるようなインタフェースというのを初めて見た方もいらっしゃるかもしれません。
あるクラスを起点にして、メソッドをつなげて読んでいき、最後に結果を得るという物です。

GuavaですとFluentIterableクラスを起点にしてメソッドチェーンを行っていき、結果を得ます。
メソッドを連続に呼び出す見た目になれていない方はまずは下記のサンプルコードで目を慣らしてください。

表題通り、FluentIterable.filterメソッドを利用してリストのフィルタリングを行います。

以前の章で作成したWarriorクラスを少しかえたものです。
class Warrior {
  public Warrior(String name, Integer hp, Long exp){
    this.name = name;
    this.hp = hp;
    this.exp = exp;
  }

  String name;
  Integer hp;
  Long exp;
}

次に3章で紹介したPredicateインタフェースを実装する事でフィルタリングの定義をします。

class WarriorHpFilter implements Predicate<Warrior> {
  @Override
  public boolean apply(Warrior warrior) {
    return warrior.hp > 25;
  }
}

Warriorクラスを複数生成してリストにし、フィルタリングしてみます。
Warrior w1 = new Warrior("bartz", 30, 123L);
Warrior w2 = new Warrior("lenna", 10, 123L);
Warrior w3 = new Warrior("faris", 20, 123L);
Warrior w4 = new Warrior("galuf", 40, 123L);

List<Warrior> warriorList = Lists.newArrayList(w1, w2, w3, w4); // --(1)

Iterable<Warrior> filteredList = FluentIterable.from(warriorList).filter(new WarriorHpPredicate()).toList(); //--(2)

for (Warrior warrior : filteredList) {
  System.out.println("name = " + warrior.name + ", hp = " + warrior.hp);
}

(1)ですが、Lists.newArrayListもGuavaの機能です。リストを宣言しつつ値をaddする事ができます。
(2)でhpが25以上のWarriorオブジェクトのみをフィルタリングし、最後にtoList()でリストにしました。
結果リストは以下です。

name = bartz, hp = 30
name = galuf, hp = 40

想定通りhpが25以上のオブジェクトのリストになるようフィルタリングできました。
Guavaを使用しないで同様の処理を行う場合、for文でまわしてif文で判定し・・・等とやりますが、
上記記法でfor文もif文も使わずに済み、ソースがすっきりするのが良い点だと思います。
最終更新:2014年01月12日 16:57
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。