Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.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
Functional programming 是否有任何rxjava操作符像throttle而不是filter?_Functional Programming_Rx Java_Rx Java2_Throttling - Fatal编程技术网

Functional programming 是否有任何rxjava操作符像throttle而不是filter?

Functional programming 是否有任何rxjava操作符像throttle而不是filter?,functional-programming,rx-java,rx-java2,throttling,Functional Programming,Rx Java,Rx Java2,Throttling,假设有一个高速公路入口和一个停车标志 规则如下: 1、第一辆无需等待立即进入高速公路的车。 2、任何其他时间,其他车辆必须在前一辆车通过后至少等待2.5秒。 3,请注意,这并不意味着所有车辆必须等待2.5秒。 例如,第一辆车立即通过。10小时后,第二辆车来了。它应该马上过去,因为第一辆车已经过去了10个小时,这是很久以前的事了。 让第二辆车等2.5秒是没有意义的。但假设在第二辆车出现1200毫秒后,第三辆车出现了,这辆车立刻就过去了。第三辆车需要等待1300毫秒 我在github中使用了单元测试

假设有一个高速公路入口和一个停车标志

规则如下:

1、第一辆无需等待立即进入高速公路的车。 2、任何其他时间,其他车辆必须在前一辆车通过后至少等待2.5秒。 3,请注意,这并不意味着所有车辆必须等待2.5秒。 例如,第一辆车立即通过。10小时后,第二辆车来了。它应该马上过去,因为第一辆车已经过去了10个小时,这是很久以前的事了。 让第二辆车等2.5秒是没有意义的。但假设在第二辆车出现1200毫秒后,第三辆车出现了,这辆车立刻就过去了。第三辆车需要等待1300毫秒

我在github中使用了单元测试的代码,并且单元测试通过了。但我真的不喜欢我引入了副作用这一事实

    private int passedCarCount;
    private int timeSpanCount;
因此,我编写这个示例应用程序是希望请rx专家优化代码。如果我们能以干净的方式完成,我们将不胜感激

package com.tonytangandroid.rxjava_stop_sign.demo;

import java.util.concurrent.TimeUnit;

import io.reactivex.Observable;
import io.reactivex.Scheduler;

public class ThrottleCarStream {

    private final CarStream carStream;
    private final Scheduler scheduler;
    private int passedCarCount;
    private int timeSpanCount;

    public ThrottleCarStream(CarStream carStream, Scheduler scheduler) {
        this.carStream = carStream;
        this.scheduler = scheduler;
    }


    public Observable<Car> periodUserActionStream() {
        return zip();
    }


    private Observable<Car> zip() {
        return Observable.zip(rawStream(), internal(), this::value);
    }

    private Observable<Long> internal() {
        return Observable.interval(0, 2500, TimeUnit.MILLISECONDS, scheduler)
            .doOnSubscribe(disposable -> initSpanCount())
            .filter(c -> whenCarCountGreaterOrEqualThanTimeSpanCount())
            .doOnNext(aLong -> increaseSpanCount());
    }

    private boolean whenCarCountGreaterOrEqualThanTimeSpanCount() {
        return passedCarCount >= timeSpanCount;
    }

    private void increaseSpanCount() {
        timeSpanCount++;
    }

    private void initSpanCount() {
        timeSpanCount = 0;
    }

    private Car value(Car cmdMessage, Long time) {
        return cmdMessage;
    }

    private Observable<Car> rawStream() {
        return carStream.cmdStream()
            .doOnSubscribe(disposable -> initElementCount())
            .doOnNext(cmdMessage -> increaseElementCount());
    }

    private void increaseElementCount() {
        passedCarCount++;
    }

    private void initElementCount() {
        passedCarCount = 0;
    }


}

package com.tonytangandroid.rxjava\u stop\u sign.demo;
导入java.util.concurrent.TimeUnit;
导入io.reactivex.Observable;
导入io.reactivex.Scheduler;
公共类ThrottleCastream{
私人最终车流;
专用最终调度器;
私用整数密码;
私人国际时间统计;
公共ThrottleCarStream(CarStream、调度程序){
this.carStream=carStream;
this.scheduler=调度程序;
}
公共可观测时段UserActionStream(){
返回zip();
}
私有可观察zip(){
返回Observable.zip(rawStream(),internal(),this::value);
}
私有可观测内部(){
返回可观察的时间间隔(0,2500,TimeUnit.ms,调度程序)
.doOnSubscribe(一次性->initSpanCount())
.filter(c->WhenCarCountgreater或QualthAntimespanCount())
.doOnNext(沿->增加spanCount());
}
私有布尔值WhenCarCountGreater或QualthAntiSpanCount()时{
返回passedCarCount>=timeSpanCount;
}
私有void递增spancount(){
timeSpanCount++;
}
私有void initSpanCount(){
timeSpanCount=0;
}
私家车价值(汽车信息,长时间){
返回消息;
}
私有可观测原始流(){
返回carStream.cmdStream()
.doOnSubscribe(一次性->initElementCount())
.doOnNext(cmdMessage->increaseElementCount());
}
私有void increaseElementCount(){
passedCarCount++;
}
私有void initElementCount(){
passedCarCount=0;
}
}
这应该可以:

@RequiredArgsConstructor
公共类DelayTransformer实现了ObservateTransformer{
private Long last=null;
最终长期限制;
@凌驾
公共可观测资源应用(最终可观测上游){
返回上游。平面图(x->{
最终长电流=System.currentTimeMillis();
最终长延迟=最后==空?
0:Math.max(0,limit-(current-last));
last=电流+延迟;
返回可观察的.just(x).delay(delay,TimeUnit.ms);
});
}
}
//来电者
可观察的car1=可观察的
.just(“car1”)
.延迟(100,时间单位毫秒);
可观察的car2=可观察的
.just(“car2”)
.延迟(200,时间单位为毫秒);
可观察的car3=可观察的
.just(“car3”)
.延迟(2500,时间单位为毫秒);
可观察的汽车=可观察的
.合并(car1、car2、car3);
汽车
.doOnNext(x->log.info(“接收:{}”,x))
.compose(新变压器(1500))
.blockingSubscribe(x->log.info(“发出:{}”,x));
我得到了这个输出:

[INFO ] 2019-12-28 01:11:06.107 [RxComputationThreadPool-1] App - Received: car1
[INFO ] 2019-12-28 01:11:06.128 [main] App - Emitted: car1
[INFO ] 2019-12-28 01:11:06.189 [RxComputationThreadPool-2] App - Received: car2
[INFO ] 2019-12-28 01:11:07.622 [main] App - Emitted: car2
[INFO ] 2019-12-28 01:11:08.490 [RxComputationThreadPool-3] App - Received: car3
[INFO ] 2019-12-28 01:11:09.122 [main] App - Emitted: car3

谢谢你努力帮助我。解决方案是有效的。但是我想知道我们是否有可能避免使用
System.currentTimeMillis()
?那么,您应该能够使用
System.nanoTime()也是。