RxJava: buffer items until some condition is true for current item

后端 未结 1 1185
佛祖请我去吃肉
佛祖请我去吃肉 2021-01-03 10:47

Here\'s a snippet I\'m trying to figure out:

class RaceCondition {

    Subject subject = Pu         


        
相关标签:
1条回答
  • 2021-01-03 11:18

    If I understand correctly, you want to buffer until some predicate allows it based on the items. You can do this with a complicated set of operators but perhaps its easier to just write a custom operator:

    public final class BufferUntil<T> 
    implements Operator<List<T>, T>{
    
        final Func1<T, Boolean> boundaryPredicate;
    
        public BufferUntil(Func1<T, Boolean> boundaryPredicate) {
            this.boundaryPredicate = boundaryPredicate;
        }
    
        @Override
        public Subscriber<? super T> call(
                Subscriber<? super List<T>> child) {
            BufferWhileSubscriber parent = 
                    new BufferWhileSubscriber(child);
            child.add(parent);
            return parent;
        }
    
        final class BufferWhileSubscriber extends Subscriber<T> {
            final Subscriber<? super List<T>> actual;
    
            List<T> buffer = new ArrayList<>();
    
            /**
             * @param actual
             */
            public BufferWhileSubscriber(
                    Subscriber<? super List<T>> actual) {
                this.actual = actual;
            }
    
            @Override
            public void onNext(T t) {
                buffer.add(t);
                if (boundaryPredicate.call(t)) {
                    actual.onNext(buffer);
                    buffer = new ArrayList<>();
                }
            }
    
            @Override
            public void onError(Throwable e) {
                buffer = null;
                actual.onError(e);
            }
    
            @Override
            public void onCompleted() {
                List<T> b = buffer;
                buffer = null;
                if (!b.isEmpty()) {
                    actual.onNext(b);
                }
                actual.onCompleted();
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题