当前位置: 首页 > 知识库问答 >
问题:

使用带动态参数的Mono方法

姜天宇
2023-03-14

我有一个函数将输入作为Mono返回:

public static Mono<Integer> emitter(int param){
    return Mono.just(param)
            .delayElement(Duration.ofMillis(100)); //delay to simulate http response
}

我想用初始值3调用发射器一次,然后重复调用,直到达到一定的大小。这个重复逻辑应该在main方法中,所以我不能修改发射器()。

public static void main(String[] args){
    int maxSize = 5;
    int initial = 3;
    Mono<Integer> response = emitter(initial);

    response
        .doOnNext(s -> {
            System.out.println("need more!");
        })
        .subscribe();
}

一个简单的解决方案是:

public static void main(String[] args){
    int maxSize = 5;
    int initial = 3;

    for(int i = 0; i < 999; i++) {
        Mono<Integer> response = emitter(initial+i);
        Mono<Boolean> isDone = response
                .flatMap(elem -> {
                    if(elem < maxSize) {
                        System.out.println("need more!");
                        return Mono.just(false);
                    } else {
                        System.out.println("ok done!");
                        return Mono.just(true);
                    }
                });
        if(isDone.block())
            break;
    }
}

基本上,我正在尝试根据前一个单声道的结果创建另一个具有动态参数的单声道。我知道Mono/Flux是不变的。。。有没有一种简洁、反应迅速的方法?我试过像Flux这样的东西。范围(0,整数。MAX\u值)。zipWith(myMono)尝试将参数输入发射器,但无法使其工作。

附言。我知道我的例子没有多大意义。我试图简化我的真实世界场景,其中涉及列表和Spring WebFlux(发射器)。

谢啦!

---编辑

好的,下面是我想到的:

public static void main(String[] args) throws InterruptedException {
    int maxSize = 5;
    int initial = 3;

    Flux.range(initial, 10)
            .delayElements(Duration.ofSeconds(1))  
            .flatMap(param -> emitter(param))
            .flatMap(it -> {
                if(it < maxSize) {
                    System.out.println("need more!: " + it);
                    return Mono.just(false);
                } else {
                    System.out.println("done!: " + it);
                    return Mono.just(true);
                }
             })
            .takeUntil(Boolean::booleanValue)
            .subscribe();

    Thread.sleep(6000);
}
need more!: 3
need more!: 4
done!: 5

一个问题是,如果我不延迟通量。范围内,执行不按顺序进行,输出的打印语句可能多于或少于预期的3行。

共有1个答案

章宏峻
2023-03-14

您可以使用Publisher的expand函数,其作用类似于递归,例如。

emitter(initial)
    .expand(i -> i < maxSize ? emitter(i + 1) : Mono.empty())
    .doOnNext(i -> System.out.println("i = " + i))
    .subscribe();
 类似资料:
  • 问题内容: 我正在寻找一个窍门。我知道如何在JavaScript中调用动态的任意函数,并传递特定的参数,如下所示: 我知道如何使用内部的集合传递可选的,无限制的参数,但是,我不知道如何发送任意数量的参数以动态发送给它;我该如何完成这样的工作,但是要有任意数量的可选参数(不要使用丑陋的– )? 问题答案: 使用函数的apply方法:- 编辑 :在我看来,这将是一个稍微的调整会更有用: 这将在浏览器之

  • 是否有可能将方法引用与参数一起使用?我喜欢流的想法,我只是想让代码更易读。 实际上,我认为有一个类似的问题,方法引用了一个参数,我读了,但不知道如何在我的代码中使用bind2方法。这是唯一的解决办法吗?

  • 问题内容: 在Java 8中,具有以下类 可以通过方法引用来调用setBornTrue方法: 但是我将如何使用forEach方法并通过 方法引用 使用setBorn ?试: 导致错误“无法解析方法setBorn”。 另外,我该如何传递True的值? 问题答案: 使用lambda: 没有发现仅使用Java 8 API的其他方法。 使用此自定义功能: 你可以做: 如果Java API或库中提供了这种实

  • 我有一个要求。你能建议一下实现这一目标的可能方法吗。 我想根据每个路由中传递的URL更改应用程序的主题。我正在使用以下技术。-前端:AngularJS-后端:节点。js 例如:localhost/x/关于localhost/y/关于 我通过使用Location传递参数,通过cookies实现了这些。登录时进行搜索。但我在所有路线上都需要那个主题参数。基于这个主题,我们需要改变。有人能提出可能的方法

  • 有没有办法用参数模拟静态方法。 我看到了很多关于这个问题的问题,但是我找不到任何与之相关的问题。

  • 我直接在web界面中生成了一个新的动态链接。这基本上将用于每个人,或者这是我的希望。让我们将该链接称为link.some-app.com/email-link。然后,我将其设置为指向https://some-app-123f.firebaseapp.com/__/auth/action。去第一个带我去第二个,到目前为止一切都很好。这些链接只是打开网页,而不是应用程序,也没有中间页面。 我可以用li