Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RxJava:缓冲项,直到当前项的某些条件为真_Java_Rx Java - Fatal编程技术网

RxJava:缓冲项,直到当前项的某些条件为真

RxJava:缓冲项,直到当前项的某些条件为真,java,rx-java,Java,Rx Java,下面是我想弄明白的一个片段: class条件{ Subject Subject=PublishSubject.create(); 公共void入口点(整数数据){ subject.onNext(数据); } 公共无效客户端(){ 主题/*一些操作*/ .buffer(getClosingSelector()) .订阅(/*处理结果*/); } 私有可观测getClosingSelector(){ 返回主题/*某些筛选*/; } } 有一个主题,它接受来自外部的事件。有一个订阅此主题的客户机,它

下面是我想弄明白的一个片段:

class条件{
Subject Subject=PublishSubject.create();
公共void入口点(整数数据){
subject.onNext(数据);
}
公共无效客户端(){
主题/*一些操作*/
.buffer(getClosingSelector())
.订阅(/*处理结果*/);
}
私有可观测getClosingSelector(){
返回主题/*某些筛选*/;
}
}
有一个
主题
,它接受来自外部的事件。有一个订阅此主题的客户机,它处理事件,并
缓冲
s它们。这里的主要思想是,每次都应该根据使用流中的项计算的某些条件来发出缓冲项

为此,缓冲区边界本身侦听对象

一个重要的期望行为:每当边界发射项目时,它也应包括在
缓冲区的后续发射中。当前配置不是这种情况,因为项目(至少我认为是这样)在到达
缓冲区之前从关闭选择器发出,因此它不包括在当前发出中,而是留在后面等待下一个发出


有没有一种方法可以让关闭选择器先等待缓冲项?如果没有,是否有其他方法可以根据下一个传入项目缓冲和释放项目?

如果我理解正确,您希望缓冲,直到某个谓词允许它基于项目。您可以使用一组复杂的运算符来执行此操作,但只编写自定义运算符可能更容易:

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();
        }
    }
}
公共最终类缓冲区
机具操作员{
最终Func1边界谓词;
公共缓冲区(Func1边界谓词){
this.boundaryPredicate=boundaryPredicate;
}
@凌驾

公共订阅次数很多,David!这正是我想要的。你能展示一下如何实现一个
BufferUntil
,以一个可观察的作为条件吗?在另一个可观察的完成之前进行缓冲吗?我试着让它工作,但就是不知道怎么做。。。