FluentIterator implements ImmutableIterator<T> { public <S> FluentIterator<Pair<T, S>> zip(Iterator<S> s, boolean weak) { Pair<Iterator<T>, Iterator<S>> p = pairOf(this, s); return fluent(Iterators.zip(p, weak)); } FluentIterator(Iterator<T> t); static FluentIterator<T> fluent(Iterator<T> t); @Override boolean hasNext(); @Override T next(); boolean weakEquals(Iterator<T> s, int n); @SuppressWarnings("unchecked") FluentIterator<T> filter(Predicate<? super T> p); boolean any(Predicate<? super T> p); boolean all(Predicate<? super T> p); @SuppressWarnings("unchecked") FluentIterator<T> concat(Iterator... ts); FluentIterator<T> peek(Consumer<? super T> cs); List<T> take(int n); List<T> takeAll(); FluentIterator<T> limit(int n); List<FluentIterator<T>> tee(int n); FluentIterator<Pair<T, S>> zip(Iterator<S> s, boolean weak); FluentIterator<List<T>> groupBy(Function<T, K> key); FluentIterator<List<T>> groupBy(); FluentIterator<T> skipDuplicates(Function<T, K> key); FluentIterator<T> skipDuplicates(); FluentIterator<T> keepFirst(Function<? super T, ? extends K> key); FluentIterator<T> keepLast(Function<? super T, ? extends K> key); FluentIterator<V> map(Function<T, V> f); FluentIterator<T> map(Iterator<T> t, BinaryOperator<T> f); T reduce(BinaryOperator<T> f); V reduce(BiFunction<V, T, V> f, V start);  }
@Test public void testZip() { FluentIterator<Integer> s = fluent(repeat(10)); Iterator<Integer> t = repeat(20); FluentIterator<Pair<Integer, Integer>> st = s.zip(t, true); Function<Pair<Integer, Integer>, Integer> psum = q -> weakBinaryOperator((Integer x, Integer y) -> x + y).apply(q.getFirst(), q.getSecond()); BinaryOperator<Integer> acc = (a, b) -> a + b; int sum = st.map(psum).limit(5).reduce(acc); assertEquals(150, sum); s = fluent(empty()); sum = s.zip(repeat(20), true) .map(psum).limit(5) .reduce(acc); assertEquals(100, sum); FluentIterator<Integer> vs = fluent(of(10, 20, 30, 40, 50)); Iterator<Boolean> bs = cycle(true, false); sum = vs.zip(bs, false) .map(Pair::getFirst) .limit(5) .reduce(acc); assertEquals(150, sum); }