@@ -1661,7 +1661,7 @@ public Iterator<T> iterator() {
1661
1661
* @return The single element in the observable sequence.
1662
1662
*/
1663
1663
public static <T > T single (Observable <T > that ) {
1664
- return single (that , Functions .< T > alwaysTrue () );
1664
+ return singleOrDefault (that , false , null );
1665
1665
}
1666
1666
1667
1667
/**
@@ -1673,7 +1673,7 @@ public static <T> T single(Observable<T> that) {
1673
1673
* @return The single element in the observable sequence.
1674
1674
*/
1675
1675
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 ) );
1677
1677
}
1678
1678
1679
1679
/**
@@ -1704,7 +1704,7 @@ public Boolean call(T t) {
1704
1704
* @return The single element in the observable sequence, or a default value if no value is found.
1705
1705
*/
1706
1706
public static <T > T singleOrDefault (Observable <T > that , T defaultValue ) {
1707
- return singleOrDefault (that , defaultValue , Functions .< T > alwaysTrue () );
1707
+ return singleOrDefault (that , true , defaultValue );
1708
1708
}
1709
1709
1710
1710
/**
@@ -1716,7 +1716,7 @@ public static <T> T singleOrDefault(Observable<T> that, T defaultValue) {
1716
1716
* @return The single element in the observable sequence, or a default value if no value is found.
1717
1717
*/
1718
1718
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 );
1720
1720
}
1721
1721
1722
1722
/**
@@ -1739,7 +1739,7 @@ public Boolean call(T t) {
1739
1739
});
1740
1740
}
1741
1741
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 ) {
1743
1743
Iterator <T > it = that .toIterable ().iterator ();
1744
1744
1745
1745
if (!it .hasNext ()) {
@@ -1755,13 +1755,6 @@ private static <T> T singleOrDefault(Observable<T> that, boolean hasDefault, T d
1755
1755
throw new IllegalStateException ("Expected single entry. Actually more than one entry." );
1756
1756
}
1757
1757
1758
- if (!predicate .call (result )) {
1759
- if (hasDefault ) {
1760
- return defaultVal ;
1761
- }
1762
- throw new IllegalStateException ("Last value should match the predicate" );
1763
- }
1764
-
1765
1758
return result ;
1766
1759
}
1767
1760
@@ -2928,6 +2921,23 @@ public void testSingleDefault() {
2928
2921
assertEquals ("default" , observable .singleOrDefault ("default" ));
2929
2922
}
2930
2923
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
+
2931
2941
@ Test (expected = IllegalStateException .class )
2932
2942
public void testSingleWrong () {
2933
2943
Observable <Integer > observable = toObservable (1 , 2 );
@@ -2946,17 +2956,28 @@ public Boolean call(Integer args) {
2946
2956
}
2947
2957
2948
2958
@ Test
2949
- public void testSingleDefaultWrongPredicate () {
2950
- Observable <String > observable = toObservable ("one" );
2959
+ public void testSingleDefaultPredicateMatchesNothing () {
2960
+ Observable <String > observable = toObservable ("one" , "two" );
2951
2961
String result = observable .singleOrDefault ("default" , new Func1 <String , Boolean >() {
2952
2962
@ Override
2953
2963
public Boolean call (String args ) {
2954
- return args .length () > 3 ;
2964
+ return args .length () == 4 ;
2955
2965
}
2956
2966
});
2957
2967
assertEquals ("default" , result );
2958
2968
}
2959
2969
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
+
2960
2981
private static class TestException extends RuntimeException {
2961
2982
2962
2983
}
0 commit comments