■
今日もGoogle製 JavaライブラリーのGuavaで遊んでました。といっても大抵の時間は、Total war というゲームで遊んでましたが。
その中で。FunctionIterableというクラスが書けました。これは、AbstractIteratorのデモを考えているうちに思いついたのですが
ファンクションって原則1つしか変換できないじゃないですか。でも中には複数返したい場合もある。そういうIterableに対応
//これ、FluentIterableのtransformAndConcat使えば必要ないことにあとで、気づいた。
FunctionIterable
@Override
public Iterable
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 Iteratoriterator;
private Iteratorretiterable;
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();
}
}