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

后端 未结 1 1186
佛祖请我去吃肉
佛祖请我去吃肉 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 
    implements Operator, T>{
    
        final Func1 boundaryPredicate;
    
        public BufferUntil(Func1 boundaryPredicate) {
            this.boundaryPredicate = boundaryPredicate;
        }
    
        @Override
        public Subscriber call(
                Subscriber> child) {
            BufferWhileSubscriber parent = 
                    new BufferWhileSubscriber(child);
            child.add(parent);
            return parent;
        }
    
        final class BufferWhileSubscriber extends Subscriber {
            final Subscriber> actual;
    
            List buffer = new ArrayList<>();
    
            /**
             * @param actual
             */
            public BufferWhileSubscriber(
                    Subscriber> 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 b = buffer;
                buffer = null;
                if (!b.isEmpty()) {
                    actual.onNext(b);
                }
                actual.onCompleted();
            }
        }
    }
    

    0 讨论(0)
提交回复
热议问题