26
26
/**
27
27
* Returns the minimum element in an observable sequence.
28
28
*/
29
- public class OperationMin {
29
+ public class OperationMinMax {
30
30
31
31
public static <T extends Comparable <T >> Observable <T > min (
32
32
Observable <T > source ) {
33
+ return minMax (source , -1L );
34
+ }
35
+
36
+ public static <T > Observable <T > min (Observable <T > source ,
37
+ final Comparator <T > comparator ) {
38
+ return minMax (source , comparator , -1L );
39
+ }
40
+
41
+ public static <T , R extends Comparable <R >> Observable <List <T >> minBy (
42
+ Observable <T > source , final Func1 <T , R > selector ) {
43
+ return minMaxBy (source , selector , -1L );
44
+ }
45
+
46
+ public static <T , R > Observable <List <T >> minBy (Observable <T > source ,
47
+ final Func1 <T , R > selector , final Comparator <R > comparator ) {
48
+ return minMaxBy (source , selector , comparator , -1L );
49
+ }
50
+
51
+ public static <T extends Comparable <T >> Observable <T > max (
52
+ Observable <T > source ) {
53
+ return minMax (source , 1L );
54
+ }
55
+
56
+ public static <T > Observable <T > max (Observable <T > source ,
57
+ final Comparator <T > comparator ) {
58
+ return minMax (source , comparator , 1L );
59
+ }
60
+
61
+ public static <T , R extends Comparable <R >> Observable <List <T >> maxBy (
62
+ Observable <T > source , final Func1 <T , R > selector ) {
63
+ return minMaxBy (source , selector , 1L );
64
+ }
65
+
66
+ public static <T , R > Observable <List <T >> maxBy (Observable <T > source ,
67
+ final Func1 <T , R > selector , final Comparator <R > comparator ) {
68
+ return minMaxBy (source , selector , comparator , 1L );
69
+ }
70
+
71
+ private static <T extends Comparable <T >> Observable <T > minMax (
72
+ Observable <T > source , final long flag ) {
33
73
return source .reduce (new Func2 <T , T , T >() {
34
74
@ Override
35
75
public T call (T acc , T value ) {
36
- if (acc .compareTo (value ) < 0 ) {
76
+ if (flag * acc .compareTo (value ) > 0 ) {
37
77
return acc ;
38
78
}
39
79
return value ;
40
80
}
41
81
});
42
82
}
43
83
44
- public static <T > Observable <T > min (Observable <T > source ,
45
- final Comparator <T > comparator ) {
84
+ private static <T > Observable <T > minMax (Observable <T > source ,
85
+ final Comparator <T > comparator , final long flag ) {
46
86
return source .reduce (new Func2 <T , T , T >() {
47
87
@ Override
48
88
public T call (T acc , T value ) {
49
- if (comparator .compare (acc , value ) < 0 ) {
89
+ if (flag * comparator .compare (acc , value ) > 0 ) {
50
90
return acc ;
51
91
}
52
92
return value ;
53
93
}
54
94
});
55
95
}
56
96
57
- public static <T , R extends Comparable <R >> Observable <List <T >> minBy (
58
- Observable <T > source , final Func1 <T , R > selector ) {
97
+ private static <T , R extends Comparable <R >> Observable <List <T >> minMaxBy (
98
+ Observable <T > source , final Func1 <T , R > selector , final long flag ) {
59
99
return source .reduce (new ArrayList <T >(),
60
100
new Func2 <List <T >, T , List <T >>() {
61
101
@@ -64,12 +104,12 @@ public List<T> call(List<T> acc, T value) {
64
104
if (acc .isEmpty ()) {
65
105
acc .add (value );
66
106
} else {
67
- int flag = selector .call (acc .get (0 )).compareTo (
68
- selector .call (value ));
69
- if (flag > 0 ) {
70
- acc .clear ();
107
+ int compareResult = selector .call (acc .get (0 ))
108
+ .compareTo (selector .call (value ));
109
+ if (compareResult == 0 ) {
71
110
acc .add (value );
72
- } else if (flag == 0 ) {
111
+ } else if (flag * compareResult < 0 ) {
112
+ acc .clear ();
73
113
acc .add (value );
74
114
}
75
115
}
@@ -78,8 +118,9 @@ public List<T> call(List<T> acc, T value) {
78
118
});
79
119
}
80
120
81
- public static <T , R > Observable <List <T >> minBy (Observable <T > source ,
82
- final Func1 <T , R > selector , final Comparator <R > comparator ) {
121
+ private static <T , R > Observable <List <T >> minMaxBy (Observable <T > source ,
122
+ final Func1 <T , R > selector , final Comparator <R > comparator ,
123
+ final long flag ) {
83
124
return source .reduce (new ArrayList <T >(),
84
125
new Func2 <List <T >, T , List <T >>() {
85
126
@@ -88,13 +129,13 @@ public List<T> call(List<T> acc, T value) {
88
129
if (acc .isEmpty ()) {
89
130
acc .add (value );
90
131
} else {
91
- int flag = comparator .compare (
132
+ int compareResult = comparator .compare (
92
133
selector .call (acc .get (0 )),
93
134
selector .call (value ));
94
- if (flag > 0 ) {
95
- acc .clear ();
135
+ if (compareResult == 0 ) {
96
136
acc .add (value );
97
- } else if (flag == 0 ) {
137
+ } else if (flag * compareResult < 0 ) {
138
+ acc .clear ();
98
139
acc .add (value );
99
140
}
100
141
}
0 commit comments