Skip to content

Commit fbaa5e0

Browse files
committed
OperatorAny
1 parent 4e0ce47 commit fbaa5e0

File tree

4 files changed

+94
-147
lines changed

4 files changed

+94
-147
lines changed

rxjava-core/src/main/java/rx/Observable.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
import rx.operators.OnSubscribeFromIterable;
5050
import rx.operators.OnSubscribeRange;
5151
import rx.operators.OperationAll;
52-
import rx.operators.OperationAny;
52+
import rx.operators.OperatorAny;
5353
import rx.operators.OperationAsObservable;
5454
import rx.operators.OperationBuffer;
5555
import rx.operators.OperationCombineLatest;
@@ -3893,7 +3893,7 @@ public final Observable<T> elementAtOrDefault(int index, T defaultValue) {
38933893
* @see <a href="http://msdn.microsoft.com/en-us/library/hh211993.aspx">MSDN: Observable.Any (Note: the description in this page was wrong at the time of this writing)</a>
38943894
*/
38953895
public final Observable<Boolean> exists(Func1<? super T, Boolean> predicate) {
3896-
return create(OperationAny.exists(this, predicate));
3896+
return lift(new OperatorAny<T>(predicate, false));
38973897
}
38983898

38993899
/**
@@ -4126,7 +4126,7 @@ public final Observable<T> ignoreElements() {
41264126
* @see <a href= "http://msdn.microsoft.com/en-us/library/hh229905.aspx">MSDN: Observable.Any</a>
41274127
*/
41284128
public final Observable<Boolean> isEmpty() {
4129-
return create(OperationAny.isEmpty(this));
4129+
return lift(new OperatorAny<T>(Functions.alwaysTrue(), true)); // create(OperatorAny.isEmpty(this));
41304130
}
41314131

41324132
/**

rxjava-core/src/main/java/rx/operators/OperationAny.java

Lines changed: 0 additions & 127 deletions
This file was deleted.
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
/**
2+
* Copyright 2014 Netflix, Inc.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package rx.operators;
17+
18+
19+
import rx.Observable;
20+
import rx.Observable.Operator;
21+
import rx.Subscriber;
22+
import rx.functions.Func1;
23+
24+
/**
25+
* Returns an {@link Observable} that emits <code>true</code> if any element of
26+
* an observable sequence satisfies a condition, otherwise <code>false</code>.
27+
*/
28+
public final class OperatorAny<T> implements Operator<Boolean, T> {
29+
private final Func1<? super T, Boolean> predicate;
30+
private final boolean returnOnEmpty;
31+
32+
public OperatorAny(Func1<? super T, Boolean> predicate, boolean returnOnEmpty) {
33+
this.predicate = predicate;
34+
this.returnOnEmpty = returnOnEmpty;
35+
}
36+
37+
@Override
38+
public Subscriber<? super T> call(final Subscriber<? super Boolean> child) {
39+
Subscriber<T> s = new Subscriber<T>() {
40+
boolean hasElements;
41+
boolean done;
42+
@Override
43+
public void onNext(T t) {
44+
hasElements = true;
45+
boolean result = predicate.call(t);
46+
if (result && !done) {
47+
done = true;
48+
child.onNext(!returnOnEmpty);
49+
child.onCompleted();
50+
unsubscribe();
51+
}
52+
}
53+
54+
@Override
55+
public void onError(Throwable e) {
56+
child.onError(e);
57+
}
58+
59+
@Override
60+
public void onCompleted() {
61+
if (!done) {
62+
done = true;
63+
if (hasElements) {
64+
child.onNext(false);
65+
} else {
66+
child.onNext(returnOnEmpty);
67+
}
68+
child.onCompleted();
69+
}
70+
}
71+
72+
};
73+
child.add(s);
74+
return s;
75+
}
76+
}

rxjava-core/src/test/java/rx/operators/OperationAnyTest.java

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -19,22 +19,20 @@
1919
import static org.mockito.Mockito.never;
2020
import static org.mockito.Mockito.times;
2121
import static org.mockito.Mockito.verify;
22-
import static rx.operators.OperationAny.any;
23-
import static rx.operators.OperationAny.exists;
24-
import static rx.operators.OperationAny.isEmpty;
2522

2623
import org.junit.Test;
2724

2825
import rx.Observable;
2926
import rx.Observer;
3027
import rx.functions.Func1;
28+
import rx.functions.Functions;
3129

3230
public class OperationAnyTest {
3331

3432
@Test
3533
public void testAnyWithTwoItems() {
3634
Observable<Integer> w = Observable.from(1, 2);
37-
Observable<Boolean> observable = Observable.create(any(w));
35+
Observable<Boolean> observable = w.exists(Functions.alwaysTrue());
3836

3937
@SuppressWarnings("unchecked")
4038
Observer<Boolean> observer = mock(Observer.class);
@@ -48,7 +46,7 @@ public void testAnyWithTwoItems() {
4846
@Test
4947
public void testIsEmptyWithTwoItems() {
5048
Observable<Integer> w = Observable.from(1, 2);
51-
Observable<Boolean> observable = Observable.create(isEmpty(w));
49+
Observable<Boolean> observable = w.isEmpty();
5250

5351
@SuppressWarnings("unchecked")
5452
Observer<Boolean> observer = mock(Observer.class);
@@ -62,7 +60,7 @@ public void testIsEmptyWithTwoItems() {
6260
@Test
6361
public void testAnyWithOneItem() {
6462
Observable<Integer> w = Observable.from(1);
65-
Observable<Boolean> observable = Observable.create(any(w));
63+
Observable<Boolean> observable = w.exists(Functions.alwaysTrue());
6664

6765
@SuppressWarnings("unchecked")
6866
Observer<Boolean> observer = mock(Observer.class);
@@ -76,7 +74,7 @@ public void testAnyWithOneItem() {
7674
@Test
7775
public void testIsEmptyWithOneItem() {
7876
Observable<Integer> w = Observable.from(1);
79-
Observable<Boolean> observable = Observable.create(isEmpty(w));
77+
Observable<Boolean> observable = w.isEmpty();
8078

8179
@SuppressWarnings("unchecked")
8280
Observer<Boolean> observer = mock(Observer.class);
@@ -90,7 +88,7 @@ public void testIsEmptyWithOneItem() {
9088
@Test
9189
public void testAnyWithEmpty() {
9290
Observable<Integer> w = Observable.empty();
93-
Observable<Boolean> observable = Observable.create(any(w));
91+
Observable<Boolean> observable = w.exists(Functions.alwaysTrue());
9492

9593
@SuppressWarnings("unchecked")
9694
Observer<Boolean> observer = mock(Observer.class);
@@ -104,7 +102,7 @@ public void testAnyWithEmpty() {
104102
@Test
105103
public void testIsEmptyWithEmpty() {
106104
Observable<Integer> w = Observable.empty();
107-
Observable<Boolean> observable = Observable.create(isEmpty(w));
105+
Observable<Boolean> observable = w.isEmpty();
108106

109107
@SuppressWarnings("unchecked")
110108
Observer<Boolean> observer = mock(Observer.class);
@@ -118,14 +116,14 @@ public void testIsEmptyWithEmpty() {
118116
@Test
119117
public void testAnyWithPredicate1() {
120118
Observable<Integer> w = Observable.from(1, 2, 3);
121-
Observable<Boolean> observable = Observable.create(any(w,
119+
Observable<Boolean> observable = w.exists(
122120
new Func1<Integer, Boolean>() {
123121

124122
@Override
125123
public Boolean call(Integer t1) {
126124
return t1 < 2;
127125
}
128-
}));
126+
});
129127

130128
@SuppressWarnings("unchecked")
131129
Observer<Boolean> observer = mock(Observer.class);
@@ -139,14 +137,14 @@ public Boolean call(Integer t1) {
139137
@Test
140138
public void testExists1() {
141139
Observable<Integer> w = Observable.from(1, 2, 3);
142-
Observable<Boolean> observable = Observable.create(exists(w,
140+
Observable<Boolean> observable = w.exists(
143141
new Func1<Integer, Boolean>() {
144142

145143
@Override
146144
public Boolean call(Integer t1) {
147145
return t1 < 2;
148146
}
149-
}));
147+
});
150148

151149
@SuppressWarnings("unchecked")
152150
Observer<Boolean> observer = mock(Observer.class);
@@ -160,14 +158,14 @@ public Boolean call(Integer t1) {
160158
@Test
161159
public void testAnyWithPredicate2() {
162160
Observable<Integer> w = Observable.from(1, 2, 3);
163-
Observable<Boolean> observable = Observable.create(any(w,
161+
Observable<Boolean> observable = w.exists(
164162
new Func1<Integer, Boolean>() {
165163

166164
@Override
167165
public Boolean call(Integer t1) {
168166
return t1 < 1;
169167
}
170-
}));
168+
});
171169

172170
@SuppressWarnings("unchecked")
173171
Observer<Boolean> observer = mock(Observer.class);
@@ -182,14 +180,14 @@ public Boolean call(Integer t1) {
182180
public void testAnyWithEmptyAndPredicate() {
183181
// If the source is empty, always output false.
184182
Observable<Integer> w = Observable.empty();
185-
Observable<Boolean> observable = Observable.create(any(w,
183+
Observable<Boolean> observable = w.exists(
186184
new Func1<Integer, Boolean>() {
187185

188186
@Override
189187
public Boolean call(Integer t1) {
190188
return true;
191189
}
192-
}));
190+
});
193191

194192
@SuppressWarnings("unchecked")
195193
Observer<Boolean> observer = mock(Observer.class);

0 commit comments

Comments
 (0)