1515
1616import org .reactivestreams .*;
1717
18- import io .reactivex .functions .BiPredicate ;
18+ import io .reactivex .functions .* ;
1919import io .reactivex .internal .fuseable .ConditionalSubscriber ;
2020import io .reactivex .internal .subscribers .*;
2121
22- public final class FlowableDistinctUntilChanged <T > extends AbstractFlowableWithUpstream <T , T > {
22+ public final class FlowableDistinctUntilChanged <T , K > extends AbstractFlowableWithUpstream <T , T > {
2323
24- final BiPredicate <? super T , ? super T > comparer ;
24+ final Function <? super T , K > keySelector ;
2525
26- public FlowableDistinctUntilChanged (Publisher <T > source , BiPredicate <? super T , ? super T > comparer ) {
26+ final BiPredicate <? super K , ? super K > comparer ;
27+
28+ public FlowableDistinctUntilChanged (Publisher <T > source , Function <? super T , K > keySelector , BiPredicate <? super K , ? super K > comparer ) {
2729 super (source );
30+ this .keySelector = keySelector ;
2831 this .comparer = comparer ;
2932 }
3033
3134 @ Override
3235 protected void subscribeActual (Subscriber <? super T > s ) {
3336 if (s instanceof ConditionalSubscriber ) {
3437 ConditionalSubscriber <? super T > cs = (ConditionalSubscriber <? super T >) s ;
35- source .subscribe (new DistinctUntilChangedConditionalSubscriber <T >(cs , comparer ));
38+ source .subscribe (new DistinctUntilChangedConditionalSubscriber <T , K >(cs , keySelector , comparer ));
3639 } else {
37- source .subscribe (new DistinctUntilChangedSubscriber <T >(s , comparer ));
40+ source .subscribe (new DistinctUntilChangedSubscriber <T , K >(s , keySelector , comparer ));
3841 }
3942 }
4043
41- static final class DistinctUntilChangedSubscriber <T > extends BasicFuseableSubscriber <T , T >
44+ static final class DistinctUntilChangedSubscriber <T , K > extends BasicFuseableSubscriber <T , T >
4245 implements ConditionalSubscriber <T > {
4346
44- final BiPredicate <? super T , ? super T > comparer ;
4547
46- T last ;
48+ final Function <? super T , K > keySelector ;
49+
50+ final BiPredicate <? super K , ? super K > comparer ;
51+
52+ K last ;
4753
4854 boolean hasValue ;
4955
5056 DistinctUntilChangedSubscriber (Subscriber <? super T > actual ,
51- BiPredicate <? super T , ? super T > comparer ) {
57+ Function <? super T , K > keySelector ,
58+ BiPredicate <? super K , ? super K > comparer ) {
5259 super (actual );
60+ this .keySelector = keySelector ;
5361 this .comparer = comparer ;
5462 }
5563
@@ -70,23 +78,25 @@ public boolean tryOnNext(T t) {
7078 return true ;
7179 }
7280
73- if (hasValue ) {
74- boolean equal ;
75- try {
76- equal = comparer .test (last , t );
77- } catch (Throwable ex ) {
78- fail (ex );
79- return false ;
80- }
81- last = t ;
82- if (equal ) {
83- return false ;
81+ K key ;
82+
83+ try {
84+ key = keySelector .apply (t );
85+ if (hasValue ) {
86+ boolean equal = comparer .test (last , key );
87+ last = key ;
88+ if (equal ) {
89+ return false ;
90+ }
91+ } else {
92+ hasValue = true ;
93+ last = key ;
8494 }
85- actual .onNext (t );
86- return true ;
95+ } catch (Throwable ex ) {
96+ fail (ex );
97+ return true ;
8798 }
88- hasValue = true ;
89- last = t ;
99+
90100 actual .onNext (t );
91101 return true ;
92102 }
@@ -103,17 +113,18 @@ public T poll() throws Exception {
103113 if (v == null ) {
104114 return null ;
105115 }
116+ K key = keySelector .apply (v );
106117 if (!hasValue ) {
107118 hasValue = true ;
108- last = v ;
119+ last = key ;
109120 return v ;
110121 }
111122
112- if (!comparer .test (last , v )) {
113- last = v ;
123+ if (!comparer .test (last , key )) {
124+ last = key ;
114125 return v ;
115126 }
116- last = v ;
127+ last = key ;
117128 if (sourceMode != SYNC ) {
118129 s .request (1 );
119130 }
@@ -122,17 +133,21 @@ public T poll() throws Exception {
122133
123134 }
124135
125- static final class DistinctUntilChangedConditionalSubscriber <T > extends BasicFuseableConditionalSubscriber <T , T > {
136+ static final class DistinctUntilChangedConditionalSubscriber <T , K > extends BasicFuseableConditionalSubscriber <T , T > {
137+
138+ final Function <? super T , K > keySelector ;
126139
127- final BiPredicate <? super T , ? super T > comparer ;
140+ final BiPredicate <? super K , ? super K > comparer ;
128141
129- T last ;
142+ K last ;
130143
131144 boolean hasValue ;
132145
133146 DistinctUntilChangedConditionalSubscriber (ConditionalSubscriber <? super T > actual ,
134- BiPredicate <? super T , ? super T > comparer ) {
147+ Function <? super T , K > keySelector ,
148+ BiPredicate <? super K , ? super K > comparer ) {
135149 super (actual );
150+ this .keySelector = keySelector ;
136151 this .comparer = comparer ;
137152 }
138153
@@ -152,20 +167,27 @@ public boolean tryOnNext(T t) {
152167 return actual .tryOnNext (t );
153168 }
154169
155- if (hasValue ) {
156- boolean equal ;
157- try {
158- equal = comparer .test (last , t );
159- } catch (Throwable ex ) {
160- fail (ex );
161- return false ;
170+ K key ;
171+
172+ try {
173+ key = keySelector .apply (t );
174+ if (hasValue ) {
175+ boolean equal = comparer .test (last , key );
176+ last = key ;
177+ if (equal ) {
178+ return false ;
179+ }
180+ } else {
181+ hasValue = true ;
182+ last = key ;
162183 }
163- last = t ;
164- return !equal && actual .tryOnNext (t );
184+ } catch (Throwable ex ) {
185+ fail (ex );
186+ return true ;
165187 }
166- hasValue = true ;
167- last = t ;
168- return actual . tryOnNext ( t ) ;
188+
189+ actual . onNext ( t ) ;
190+ return true ;
169191 }
170192
171193 @ Override
@@ -180,16 +202,18 @@ public T poll() throws Exception {
180202 if (v == null ) {
181203 return null ;
182204 }
205+ K key = keySelector .apply (v );
183206 if (!hasValue ) {
184207 hasValue = true ;
185- last = v ;
208+ last = key ;
186209 return v ;
187210 }
188- if (!comparer .test (last , v )) {
189- last = v ;
211+
212+ if (!comparer .test (last , key )) {
213+ last = key ;
190214 return v ;
191215 }
192- last = v ;
216+ last = key ;
193217 if (sourceMode != SYNC ) {
194218 s .request (1 );
195219 }
0 commit comments