延迟特定值

Delay specific values

我有一个运动传感器,它为我提供了 Subjectboolean 值。 true,当检测到移动时,false 当传感器在固定的、不可更改的时间范围后未检测到任何东西时。

我想在运动时开灯,但灯应该在给定的时间内保持亮着。 false应该延迟。

如果发出了 true 值,而延迟是“延迟”,则不应发生任何事情(也就是灯应保持亮着)。

考虑这个table

time t emitted value action
1 true turn lights on
2 false do nothing
3 none emitted turn lights off
4 true turn lights on
5 false do nothing
6 true do nothing

这是一些伪代码:

motionSensor.isMoving$()
    // delayWhen-method does not exsit
    .delayWhen(Duration.of(5, MINUTES), isMoving -> !isMoving)
    .distinctUntilChanged()
    .subscribe(isMoving -> {
        if (isMoving) {
            turnLightsOn();
        } else {
            turnLightsOff();
        });

我需要这个Github Project

没找到运算符,所以写成手动风格

Subject<Boolean> isMoving$ = getSubject();

isMoving$
    .switchMap(value -> isMoving 
        ? Observable.just(isMoving) 
        : Observable.just(isMoving).delay(5, TimeUnit.MINUTES))
    .distinctUntilChanged()
    .subscribe(isMoving -> isMoving ? turnLightsOn() : turnLightsOff());

特别说明:IntelliJ 被这段代码搞糊涂了。如果它警告你,你可以忽略它。