gpt4 book ai didi

java - rxJava 等待特定值序列的更好方法

转载 作者:行者123 更新时间:2023-12-02 08:59:32 25 4
gpt4 key购买 nike

我想知道过滤通过可观察管道的特定值序列的正确方法是什么。例如:

我遇到了一个问题,我需要在管道变为 false 后执行某些操作,但只有在管道变为 true 后才需要立即执行某些操作。

Observable x = Observable.just(false, false, false, true, false);

我的第一个方法:

x
.filter(state -> state)
.switchMap(x)
.filter(state -> !state)
.subscribe(x -> doSomething())


第二种方法:

private boolean globalState = false;


private void someFunction() {
x.map(this::hasTurnedOffAgain)
.filter(state -> state)
.subscribe(doSomething)
}

...

private boolean hasTurnedOggAgain(Boolean state) {
boolean hasTurnedOff= !state && peeping;
globalState = state;
return hasFinished;
}

我有使用扫描运算符的第三个版本,但我认为对于这个简单的问题来说它太复杂了。

有没有更好的方法来实现这样的事情?甚至更复杂的序列?

谢谢您,祝您有美好的一天!

最佳答案

您可以使用 buffer() 方法来构建一个可观察量,其中包含原始可观察量中的前一个和当前项目。使用count 2 的值因为您想检查两个相邻值和 skip 1 的值因为您想向前迈出一步。

Observable<Boolean> original = Observable.just(false, false, false, true, false, false, true, true, false);

Observable<List<Boolean>> buffered = original.buffer(2, 1);

buffered.subscribe(new Consumer<List<Boolean>>() {

@Override
public void accept(List<Boolean> t) throws Exception {
System.out.println("Direct:"+t);
}
});

这将生成以下输出:

Direct:[false, false]
Direct:[false, false]
Direct:[false, true]
Direct:[true, false]
Direct:[false, false]
Direct:[false, true]
Direct:[true, true]
Direct:[true, false]
Direct:[false]

您可以使用这个新的可观察值并使用 filter()仅获取上一个条目为 true 的这些值当前条目是 false ,因此您会看到“下降沿”:

Observable<List<Boolean>> filtered = buffered.filter(l -> l.size() == 2 &&
l.get(0) == true &&
l.get(1) == false);

filtered.subscribe(new Consumer<List<Boolean>>() {

@Override
public void accept(List<Boolean> t) throws Exception {
System.out.println("Filtered: "+t);
}
});

这将生成以下输出:

Filtered: [true, false]
Filtered: [true, false]

关于java - rxJava 等待特定值序列的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60264364/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com