Collections2.filterの注意

Google Collection Library のCollection2 filter で注意すべきは、filter 機能が動作しているタイミングである。
filter の戻り値である Collection のメソッド実行時に働くことに気をつけなければならない。
これは、次のようなサンプルコードを様々に動かすことで確認できる。

final BlockingQueue<User> que = new ArrayBlockingQueue<User>(10);
Collection<User> ua = Collections2.filter(
   que
   ,new Predicate<User>(){
      @Override
      public boolean apply(User u){
         try{
         que.take();
         }catch(InterruptedException e){
         }

         return u.point > 10 ? true : false;
      }
   }
);
System.out.println("que size = "+que.size());
que.add(new User("aaa",sf.parse("2009/08/21"),10));
que.add(new User("bbb",sf.parse("2009/08/11"),12));
que.add(new User("ccc",sf.parse("2009/08/14"),18));
que.add(new User("ddd",sf.parse("2009/08/25"),7));
que.add(new User("eee",sf.parse("2009/08/12"),21));
// 以下、有効にしたり無効にしたりで確認
//System.out.println("ua.size() = "+ua.size());
//ua.toArray(new User[]{});
System.out.println("que size = "+que.size());
for(User u : ua){
   System.out.println(u.name+"\t"+sf.format(u.entrydate)+"\t"+u.point);
}
System.out.println("que size = "+que.size());