今日もGoogleJavaライブラリーのGuavaで遊んでました。といっても大抵の時間は、Total war というゲームで遊んでましたが。

その中で。FunctionIterableというクラスが書けました。これは、AbstractIteratorのデモを考えているうちに思いついたのですが

ファンクションって原則1つしか変換できないじゃないですか。でも中には複数返したい場合もある。そういうIterableに対応

//これ、FluentIterableのtransformAndConcat使えば必要ないことにあとで、気づいた。
FunctionIterable fc=new FunctionIterable(new Function>(){
@Override
public Iterable apply(String input) {
checkNotNull(input);
return Splitter.on("\n").split(input);
}
},Lists.newArrayList("hello","world\nline2\nline3"));

LogUtils.log(Joiner.on("\n").join(fc));

public static class FunctionIterable extends AbstractIterator{
private Function> function;
private Iterator iterator;
private Iterator retiterable;

public FunctionIterable(Function> function,Iterable iterable){
this.function=function;
this.iterator=iterable.iterator();
}

@Override
protected T computeNext() {
if(retiterable==null || !retiterable.hasNext()){
while(iterator.hasNext()){
retiterable=function.apply(iterator.next()).iterator();
if(retiterable.hasNext()){
T object=retiterable.next();
return object;
}
}
}else{
T object= retiterable.next();
return object;
}

return endOfData();
}

}