给定三个迭代器
it1, it2, it3
如何返回一个迭代 it1、然后迭代 it2 和最后一个 it3 的迭代器?
让我们说
def it1 = [1, 2].iterator()
def it2 = [3, 4].iterator()
def it3 = [5, 6].iterator()
我想要一个会返回的迭代器
1
2
3
4
5
6
我所知道的 Groovy 中没有这样的迭代器,但您可以编写自己的:
class SequentialIterator<T> implements Iterator<T> {
List iterators
int index = 0
boolean done = false
T next
SequentialIterator( Iterator<T> ...iterators ) {
this.iterators = iterators
loadNext()
}
private void loadNext() {
while( index < iterators.size() ) {
if( iterators[ index ].hasNext() ) {
next = iterators[ index ].next()
break
}
else {
index++
}
}
if( index >= iterators.size() ) {
done = true
}
}
void remove() {
throw UnsupportedOperationException()
}
boolean hasNext() {
!done
}
T next() {
if( done ) {
throw new NoSuchElementException()
}
T ret = next
loadNext()
ret
}
}
def it1 = [1, 2].iterator()
def it2 = [3, 4].iterator()
def it3 = [5, 6].iterator()
assert new SequentialIterator( it1, it2, it3 ).collect() == [ 1, 2, 3, 4, 5, 6 ]
或者,如果您感到贪婪(并且需要同时加载所有数据),您可以依次从迭代器中收集值:
[ it1, it2, it3 ].collectMany { it.collect() }
或者正如戴夫牛顿所说,你可以使用番石榴:
@Grab( 'com.google.guava:guava:15.0' )
import com.google.common.collect.Iterators
def it1 = [1, 2].iterator()
def it2 = [3, 4].iterator()
def it3 = [5, 6].iterator()
assert Iterators.concat( it1, it2, it3 ).collect() == [ 1, 2, 3, 4, 5, 6 ]
或commons-collections;
@Grab( 'commons-collections:commons-collections:3.2.1' )
import org.apache.commons.collections.iterators.IteratorChain
def it1 = [1, 2].iterator()
def it2 = [3, 4].iterator()
def it3 = [5, 6].iterator()
assert new IteratorChain( [ it1, it2, it3 ] ).collect() == [ 1, 2, 3, 4, 5, 6 ]