diff --git a/rxjava-core/src/main/java/rx/operators/OperatorZipIterable.java b/rxjava-core/src/main/java/rx/operators/OperatorZipIterable.java index 05f2a47c82..b5a8862a51 100644 --- a/rxjava-core/src/main/java/rx/operators/OperatorZipIterable.java +++ b/rxjava-core/src/main/java/rx/operators/OperatorZipIterable.java @@ -43,10 +43,14 @@ public Subscriber call(final Subscriber subscriber) { } catch (Throwable e) { subscriber.onError(e); } - return new Subscriber() { - + return new Subscriber(subscriber) { + boolean once; @Override public void onCompleted() { + if (once) { + return; + } + once = true; subscriber.onCompleted(); } diff --git a/rxjava-core/src/test/java/rx/operators/OperatorZipIterableTest.java b/rxjava-core/src/test/java/rx/operators/OperatorZipIterableTest.java index 6f2c84486f..39f81086f9 100644 --- a/rxjava-core/src/test/java/rx/operators/OperatorZipIterableTest.java +++ b/rxjava-core/src/test/java/rx/operators/OperatorZipIterableTest.java @@ -23,6 +23,8 @@ import java.util.Arrays; import java.util.Iterator; +import java.util.concurrent.atomic.AtomicInteger; +import static org.junit.Assert.assertEquals; import org.junit.Before; import org.junit.Test; @@ -31,6 +33,8 @@ import rx.Observable; import rx.Observer; import rx.exceptions.TestException; +import rx.functions.Action1; +import rx.functions.Func1; import rx.functions.Func2; import rx.functions.Func3; import rx.subjects.PublishSubject; @@ -346,4 +350,32 @@ public void remove() { verify(o, never()).onCompleted(); } + + Action1 printer = new Action1() { + @Override + public void call(String t1) { + System.out.println(t1); + } + }; + + static final class SquareStr implements Func1 { + final AtomicInteger counter = new AtomicInteger(); + @Override + public String call(Integer t1) { + counter.incrementAndGet(); + System.out.println("Omg I'm calculating so hard: " + t1 + "*" + t1 + "=" + (t1*t1)); + return " " + (t1*t1); + } + } + + @Test public void testTake2() { + Observable o = Observable.from(1, 2, 3, 4, 5); + Iterable it = Arrays.asList("a", "b", "c", "d", "e"); + + SquareStr squareStr = new SquareStr(); + + o.map(squareStr).zip(it, concat2Strings).take(2).subscribe(printer); + + assertEquals(2, squareStr.counter.get()); + } }