Yielder
より。JavaでC#のyield return(Python/JavaScriptのyieldの簡易版)っぽいことをやるライブラリ。
使い方については、コード例を見ればわかる。
public static <T> Iterable<T> filteredIterable(final Iterable<T> iterable, final Predicate<T> filter) { return new Yielder<T>() { @Override protected void yieldNextCore() { for (T item : iterable) { if (filter.evaluate(item)) { yieldReturn(item); } } } }; }
メソッドの戻り値はjava.util.Iteretableであり、メソッド全体をYielderオブジェクトの匿名クラスで包み、yieldNextCoreの実装に、メソッド本体にあるべきコードを記述する。yield returnしたい部分は、yieldReturnメソッドを呼ぶ。
LtUによると、内部的には、匿名クラスのyieldNextCore実装のバイトコードを仕様として、きちんと振舞うclassの生成を実行時に行っているようだ。具体的にはメソッド中のローカル変数をフィールドにしてるらしい。このへんはC#のyield入りメソッドで生成されるクラスでの対応と同じようになっている気はする。