2626/**
2727 * Returns the minimum element in an observable sequence.
2828 */
29- public class OperationMin {
29+ public class OperationMinMax {
3030
3131 public static <T extends Comparable <T >> Observable <T > min (
3232 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 ) {
3373 return source .reduce (new Func2 <T , T , T >() {
3474 @ Override
3575 public T call (T acc , T value ) {
36- if (acc .compareTo (value ) < 0 ) {
76+ if (flag * acc .compareTo (value ) > 0 ) {
3777 return acc ;
3878 }
3979 return value ;
4080 }
4181 });
4282 }
4383
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 ) {
4686 return source .reduce (new Func2 <T , T , T >() {
4787 @ Override
4888 public T call (T acc , T value ) {
49- if (comparator .compare (acc , value ) < 0 ) {
89+ if (flag * comparator .compare (acc , value ) > 0 ) {
5090 return acc ;
5191 }
5292 return value ;
5393 }
5494 });
5595 }
5696
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 ) {
5999 return source .reduce (new ArrayList <T >(),
60100 new Func2 <List <T >, T , List <T >>() {
61101
@@ -64,12 +104,12 @@ public List<T> call(List<T> acc, T value) {
64104 if (acc .isEmpty ()) {
65105 acc .add (value );
66106 } 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 ) {
71110 acc .add (value );
72- } else if (flag == 0 ) {
111+ } else if (flag * compareResult < 0 ) {
112+ acc .clear ();
73113 acc .add (value );
74114 }
75115 }
@@ -78,8 +118,9 @@ public List<T> call(List<T> acc, T value) {
78118 });
79119 }
80120
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 ) {
83124 return source .reduce (new ArrayList <T >(),
84125 new Func2 <List <T >, T , List <T >>() {
85126
@@ -88,13 +129,13 @@ public List<T> call(List<T> acc, T value) {
88129 if (acc .isEmpty ()) {
89130 acc .add (value );
90131 } else {
91- int flag = comparator .compare (
132+ int compareResult = comparator .compare (
92133 selector .call (acc .get (0 )),
93134 selector .call (value ));
94- if (flag > 0 ) {
95- acc .clear ();
135+ if (compareResult == 0 ) {
96136 acc .add (value );
97- } else if (flag == 0 ) {
137+ } else if (flag * compareResult < 0 ) {
138+ acc .clear ();
98139 acc .add (value );
99140 }
100141 }
0 commit comments