Flux.just(1, 3, 5, 2, 4, 6, 11, 12, 13)
.groupBy(i -> i % 2 == 0 ? "even" : "odd")
.subscribe(f -> f.subscribe(t->System.out.println(f.key() + " : " + t)));
输出结果:
odd : 1
odd : 3
odd : 5
even : 2
even : 4
even : 6
odd : 11
even : 12
odd : 13
FluxGroupBy的实现与FluxWindow非常类似,不同的是提供了分组的功能,window底层使用的bridge是UnicastProcessor,而groupBy底层使用的bridge是UnicastGroupedFlux。
具体细节,参见FluxGroupBy$GroupByMain#onNext,不作赘述。
public void onNext(T t) {
if(done){
Operators.onNextDropped(t, actual.currentContext());
return;
}
K key;
V value;
try {
key = Objects.requireNonNull(keySelector.apply(t), "The keySelector returned a null value");
value = Objects.requireNonNull(valueSelector.apply(t), "The valueSelector returned a null value");
}
catch (Throwable ex) {
onError(Operators.onOperatorError(s, ex, t, actual.currentContext()));
return;
}
UnicastGroupedFlux<K, V> g = groupMap.get(key);
if (g == null) {
// if the main is cancelled, don't create new groups
if (cancelled == 0) {
Queue<V> q = groupQueueSupplier.get();
GROUP_COUNT.getAndIncrement(this);
g = new UnicastGroupedFlux<>(key, q, this, prefetch);
g.onNext(value);
groupMap.put(key, g);
queue.offer(g);
drain();
}
}
else {
g.onNext(value);
}
}
groupBy常结合concatMap一起使用,后面章节会介绍concatMap的使用。