src/main/java/io/reactivex/Observable.java
@CheckReturnValue
    @SchedulerSupport(SchedulerSupport.NONE)
    public final <U, R> Observable<R> zipWith(ObservableSource<? extends U> other,
            BiFunction<? super T, ? super U, ? extends R> zipper) {
        ObjectHelper.requireNonNull(other, "other is null");
        return zip(this, other, zipper);
    }
@CheckReturnValue
    @SchedulerSupport(SchedulerSupport.NONE)
    public final <U, R> Observable<R> zipWith(ObservableSource<? extends U> other,
            BiFunction<? super T, ? super U, ? extends R> zipper) {
        ObjectHelper.requireNonNull(other, "other is null");
        return zip(this, other, zipper);
    }
Returns an Observable that emits items that are the result of applying a specified function to pairs of
values, one each from the source ObservableSource and another specified ObservableSource.
<p>
<img width="640" height="380" src="https://raw.github.com/wiki/ReactiveX/RxJava/images/rx-operators/zip.png" alt="">
<p>
The operator subscribes to its sources in order they are specified and completes eagerly if
one of the sources is shorter than the rest while disposing the other sources. Therefore, it
is possible those other sources will never be able to run to completion (and thus not calling
{@code doOnComplete()}). This can also happen if the sources are exactly the same length; if
source A completes and B has been consumed and is about to complete, the operator detects A won't
be sending further values and it will dispose B immediately. For example:
<pre><code>range(1, 5).doOnComplete(action1).zipWith(range(6, 5).doOnComplete(action2), (a, b) -&gt; a + b)</code></pre>
{@code action1} will be called but {@code action2} won't.
<br>To work around this termination property,
use {@link #doOnDispose(Action)} as well or use {@code using()} to do cleanup in case of completion
or a dispose() call.
<dl>
<dt><b>Scheduler:</b></dt>
<dd>{@code zipWith} does not operate by default on a particular {@link Scheduler}.</dd>
</dl>

@param <U>
the type of items emitted by the {@code other} ObservableSource
@param <R>
the type of items emitted by the resulting ObservableSource
@param other
the other ObservableSource
@param zipper
a function that combines the pairs of items from the two ObservableSources to generate the items to
be emitted by the resulting ObservableSource
@return an Observable that pairs up values from the source ObservableSource and the {@code other} ObservableSource
and emits the results of {@code zipFunction} applied to these pairs
@see <a href="http://reactivex.io/documentation/operators/zip.html">ReactiveX operators documentation: Zip</a>