Skip to content

Commit 3cfc156

Browse files
committed
Updated single/singleOrDefault according to review request
1 parent a581695 commit 3cfc156

File tree

1 file changed

+36
-15
lines changed

1 file changed

+36
-15
lines changed

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

Lines changed: 36 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1661,7 +1661,7 @@ public Iterator<T> iterator() {
16611661
* @return The single element in the observable sequence.
16621662
*/
16631663
public static <T> T single(Observable<T> that) {
1664-
return single(that, Functions.<T>alwaysTrue());
1664+
return singleOrDefault(that, false, null);
16651665
}
16661666

16671667
/**
@@ -1673,7 +1673,7 @@ public static <T> T single(Observable<T> that) {
16731673
* @return The single element in the observable sequence.
16741674
*/
16751675
public static <T> T single(Observable<T> that, Func1<T, Boolean> predicate) {
1676-
return singleOrDefault(that, false, null, predicate);
1676+
return single(that.filter(predicate));
16771677
}
16781678

16791679
/**
@@ -1704,7 +1704,7 @@ public Boolean call(T t) {
17041704
* @return The single element in the observable sequence, or a default value if no value is found.
17051705
*/
17061706
public static <T> T singleOrDefault(Observable<T> that, T defaultValue) {
1707-
return singleOrDefault(that, defaultValue, Functions.<T>alwaysTrue());
1707+
return singleOrDefault(that, true, defaultValue);
17081708
}
17091709

17101710
/**
@@ -1716,7 +1716,7 @@ public static <T> T singleOrDefault(Observable<T> that, T defaultValue) {
17161716
* @return The single element in the observable sequence, or a default value if no value is found.
17171717
*/
17181718
public static <T> T singleOrDefault(Observable<T> that, T defaultValue, Func1<T, Boolean> predicate) {
1719-
return singleOrDefault(that, true, defaultValue, predicate);
1719+
return singleOrDefault(that.filter(predicate), defaultValue);
17201720
}
17211721

17221722
/**
@@ -1739,7 +1739,7 @@ public Boolean call(T t) {
17391739
});
17401740
}
17411741

1742-
private static <T> T singleOrDefault(Observable<T> that, boolean hasDefault, T defaultVal, Func1<T, Boolean> predicate) {
1742+
private static <T> T singleOrDefault(Observable<T> that, boolean hasDefault, T defaultVal) {
17431743
Iterator<T> it = that.toIterable().iterator();
17441744

17451745
if (!it.hasNext()) {
@@ -1755,13 +1755,6 @@ private static <T> T singleOrDefault(Observable<T> that, boolean hasDefault, T d
17551755
throw new IllegalStateException("Expected single entry. Actually more than one entry.");
17561756
}
17571757

1758-
if (!predicate.call(result)) {
1759-
if (hasDefault) {
1760-
return defaultVal;
1761-
}
1762-
throw new IllegalStateException("Last value should match the predicate");
1763-
}
1764-
17651758
return result;
17661759
}
17671760

@@ -2928,6 +2921,23 @@ public void testSingleDefault() {
29282921
assertEquals("default", observable.singleOrDefault("default"));
29292922
}
29302923

2924+
@Test(expected = IllegalStateException.class)
2925+
public void testSingleDefaultWithMoreThanOne() {
2926+
Observable<String> observable = toObservable("one", "two", "three");
2927+
observable.singleOrDefault("default");
2928+
}
2929+
2930+
@Test
2931+
public void testSingleWithPredicateDefault() {
2932+
Observable<String> observable = toObservable("one", "two", "four");
2933+
assertEquals("four", observable.single(new Func1<String, Boolean>() {
2934+
@Override
2935+
public Boolean call(String s) {
2936+
return s.length() == 4;
2937+
}
2938+
}));
2939+
}
2940+
29312941
@Test(expected = IllegalStateException.class)
29322942
public void testSingleWrong() {
29332943
Observable<Integer> observable = toObservable(1, 2);
@@ -2946,17 +2956,28 @@ public Boolean call(Integer args) {
29462956
}
29472957

29482958
@Test
2949-
public void testSingleDefaultWrongPredicate() {
2950-
Observable<String> observable = toObservable("one");
2959+
public void testSingleDefaultPredicateMatchesNothing() {
2960+
Observable<String> observable = toObservable("one", "two");
29512961
String result = observable.singleOrDefault("default", new Func1<String, Boolean>() {
29522962
@Override
29532963
public Boolean call(String args) {
2954-
return args.length() > 3;
2964+
return args.length() == 4;
29552965
}
29562966
});
29572967
assertEquals("default", result);
29582968
}
29592969

2970+
@Test(expected = IllegalStateException.class)
2971+
public void testSingleDefaultPredicateMatchesMoreThanOne() {
2972+
Observable<String> observable = toObservable("one", "two");
2973+
String result = observable.singleOrDefault("default", new Func1<String, Boolean>() {
2974+
@Override
2975+
public Boolean call(String args) {
2976+
return args.length() == 3;
2977+
}
2978+
});
2979+
}
2980+
29602981
private static class TestException extends RuntimeException {
29612982

29622983
}

0 commit comments

Comments
 (0)