倒带RxJava中的Observable吗?

先生

我一直在将RxJava和反应式编程应用于命令行应用程序。我发现了一些非常棒的设计模式,它们确实简化了命令行界面的代码。

但是,我正在努力解决一件事。经常我发光值向下运营商的链,和我concatMap()Observable.create()对发射值征求用户输入。

这很容易,直到我想提供一种方法可以返回到先前的版本。它开始变得非常混乱,尽管我付出了很多努力,但我知道这不能100%正确地工作。我希望用户输入“ BACK”尝试通过从缓存中请求回退一次发射。是否有更好的运营商或变压器在链中的上一个点回溯排放并将其重新发送回去?

public class Test {

    public static void main(String[] args) {

        final Scanner scanner = new Scanner(System.in);
        final List<String> cache = new ArrayList<>();
        final AtomicInteger cursorIndex = new AtomicInteger(-1);


        Observable.just(
                "What is your name?",
                "What is your quest?",
                "What is your favorite color?",
                "What is the capital of Assyria?",
                "What is the velocity of an unladen swallow?"
        )
        .doOnNext(cache::add)
        .concatMap(q -> {
            int cursor = cursorIndex.get();
            if (cursor >= 0 && cursor < cache.size() - 2) {
                return Observable.just(cache.get(cursor));
            } else {
                cursorIndex.incrementAndGet();
                return Observable.just(q);
            }
        })
        .doOnNext(System.out::println)
        .concatMap(q -> Observable.create(s -> {
                    String answer = scanner.nextLine().trim();

                    if (answer.toUpperCase().equals("BACK")) {
                        cursorIndex.decrementAndGet();
                    }
                    s.onNext(answer);
                    s.onCompleted();
                })
        ).filter(s -> !s.equals("BACK"))
         .subscribe(q -> System.out.println("You said: " + q));

    }
}

    What is your name?
    Sir Lancelot
    You said: Sir Lancelot
    What is your quest?
    To seek the holy grail
    You said: To seek the holy grail
    What is your favorite color?
    BACK
    What is your quest?
阿卡诺克德

我要做的就是将索引作为BehaviorSubject并在需要在问题之间进行切换时调用onNext:

Scanner scanner = new Scanner(System.in);

String[] questions = {
        "What is your name?",
        "What is your quest?",
        "What is your favorite color?",
        "What is the capital of Assyria?",
        "What is the velocity of an unladen swallow?"
};

String[] cache = new String[questions.length];

BehaviorSubject<Integer> index = BehaviorSubject.create(0);

index
.observeOn(Schedulers.trampoline())
.concatMap(idx -> {
    if (idx == questions.length) {
        index.onCompleted();
        return Observable.empty();
    }

    System.out.println(questions[idx]);
    String answer = scanner.nextLine().trim();

    if ("BACK".equals(answer)) {
        index.onNext(Math.max(0, idx - 1));
        return Observable.empty();
    } else
    if ("QUIT".equals(answer)) {
        index.onCompleted();
        return Observable.empty();
    }

    cache[idx] = answer;
    index.onNext(idx + 1);
    return Observable.just(answer);
})
.subscribe(v -> System.out.println("You said: " + v));

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

倒带RxJava中的Observable吗?

来自分类Dev

Android中的RxJava没有Observable.create吗?

来自分类Dev

在回调rxjava中返回Observable

来自分类Dev

在回调rxjava中返回Observable

来自分类Dev

RxJava 中的 Observable.merge 和 debounce

来自分类Dev

RxJava中的Observable.create与Observable.fromAsync

来自分类Dev

RxJava-合并的Observable可以随时接受更多Observables吗?

来自分类Dev

RxJava-在Observable链中执行peek()或void操作?

来自分类Dev

RxJs中的Observable.expand()的RxJava等效项是什么?

来自分类Dev

在异步调用中创建的RxJava Observable替代方法

来自分类Dev

如何在RxJava RabbitMQ Observable中实现背压?

来自分类Dev

如何在 RxJava 中同时运行多个 Observable?

来自分类Dev

厨师从包装食谱中倒带cookbook_file定义

来自分类Dev

如何确保目录对象的读取索引在 FATFS 中倒带?

来自分类Dev

RxJava从Observable更新数据

来自分类Dev

如何在 RxJava 中将 observable 包装在另一个 observable 中?

来自分类Dev

如何在RxJava中返回聚合-collect()是正确的方法吗?

来自分类Dev

我如何在RxJava中的Observable中处理map()中的异常

来自分类Dev

我可以使用Android ExoPlayer倒带实时事件的HLS流吗?

来自分类Dev

RxJava主题是必要的吗?

来自分类Dev

BindableBase 是 MVVMLight 中 Observable 项目的正确转换吗?

来自分类Dev

RxJava 在 Observable 中收集 AMPQ 事件并使用缓冲区订阅

来自分类Dev

如何在RxJava中的自定义Observable中获得观察者取消订阅操作的通知

来自分类Dev

如何在 RxJava2 中的自定义 Observable 中获得观察者处理操作的通知

来自分类Dev

RxJava-无法访问Observable的订户?

来自分类Dev

模拟RxJava Observable的正确方法是什么

来自分类Dev

在RxJava中将Observable转换为Collection

来自分类Dev

在RxJava中正确处理空Observable

来自分类Dev

如何在RxJava中将Observable子类化?

Related 相关文章

  1. 1

    倒带RxJava中的Observable吗?

  2. 2

    Android中的RxJava没有Observable.create吗?

  3. 3

    在回调rxjava中返回Observable

  4. 4

    在回调rxjava中返回Observable

  5. 5

    RxJava 中的 Observable.merge 和 debounce

  6. 6

    RxJava中的Observable.create与Observable.fromAsync

  7. 7

    RxJava-合并的Observable可以随时接受更多Observables吗?

  8. 8

    RxJava-在Observable链中执行peek()或void操作?

  9. 9

    RxJs中的Observable.expand()的RxJava等效项是什么?

  10. 10

    在异步调用中创建的RxJava Observable替代方法

  11. 11

    如何在RxJava RabbitMQ Observable中实现背压?

  12. 12

    如何在 RxJava 中同时运行多个 Observable?

  13. 13

    厨师从包装食谱中倒带cookbook_file定义

  14. 14

    如何确保目录对象的读取索引在 FATFS 中倒带?

  15. 15

    RxJava从Observable更新数据

  16. 16

    如何在 RxJava 中将 observable 包装在另一个 observable 中?

  17. 17

    如何在RxJava中返回聚合-collect()是正确的方法吗?

  18. 18

    我如何在RxJava中的Observable中处理map()中的异常

  19. 19

    我可以使用Android ExoPlayer倒带实时事件的HLS流吗?

  20. 20

    RxJava主题是必要的吗?

  21. 21

    BindableBase 是 MVVMLight 中 Observable 项目的正确转换吗?

  22. 22

    RxJava 在 Observable 中收集 AMPQ 事件并使用缓冲区订阅

  23. 23

    如何在RxJava中的自定义Observable中获得观察者取消订阅操作的通知

  24. 24

    如何在 RxJava2 中的自定义 Observable 中获得观察者处理操作的通知

  25. 25

    RxJava-无法访问Observable的订户?

  26. 26

    模拟RxJava Observable的正确方法是什么

  27. 27

    在RxJava中将Observable转换为Collection

  28. 28

    在RxJava中正确处理空Observable

  29. 29

    如何在RxJava中将Observable子类化?

热门标签

归档