Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.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
Java 在每种元素被消耗后,在焊剂中添加副作用?_Java_Spring_Reactive Programming_Project Reactor - Fatal编程技术网

Java 在每种元素被消耗后,在焊剂中添加副作用?

Java 在每种元素被消耗后,在焊剂中添加副作用?,java,spring,reactive-programming,project-reactor,Java,Spring,Reactive Programming,Project Reactor,这是一个简化的例子,但它说明了这一点 假设我有一个定义如下的方法: 通量发生器通量(){ 返回Flux.just(“你好”,“世界”);/(S) } 例如,有没有一种方法可以使S在元素被消耗后打印一些东西,而通量的订阅者不必做或知道任何事情 例如,我想修改S,以便: generateFlux().doOnNext(System.out::println.block()) 实际将其打印到控制台: hello consumed world consumed 这是否可能使用反应堆3.3实现,如果

这是一个简化的例子,但它说明了这一点

假设我有一个定义如下的方法:

通量发生器通量(){ 返回Flux.just(“你好”,“世界”);/(S) } 例如,有没有一种方法可以使
S
在元素被消耗后打印一些东西,而通量的订阅者不必做或知道任何事情

例如,我想修改
S
,以便:

generateFlux().doOnNext(System.out::println.block())
实际将其打印到控制台:

hello
consumed
world
consumed
这是否可能使用反应堆3.3实现,如果可能,如何实现

更新 我想我的问题不清楚,所以我会补充一些细节。我问题的要点是,我希望这一点保持不变:

generateFlux().doOnNext(System.out::println.block()//A
所以我想修改
S
,即
流量。只是(“你好”,“世界”)
来适应我的要求,而不是
A
。我知道你可以在
A
中添加
subscribe
doOnNext
等,但这不是我想要的。我在问是否有办法修改
s
,以便在
a
的订户/消费者处理完所有项目后,在不对
a
进行任何更改的情况下打印:

hello
consumed
world
consumed
也就是说,
S
以某种方式接收到第一个元素已被消耗的信号(“hello”),然后它可以执行
doOnNext
(或其他)并在这种情况下打印“consumer”。当第二个元素被消费(“世界”)时,它应该再次打印“已消费”


这可能吗?

流量是发布者,使用流量数据的正确方法是使用订阅。 所以

使用subscribe并仅传递一个使用者作为参数,您将覆盖订阅服务器下一步的操作。 基本上,后面将创建一个订阅者,将这2张照片作为一种行为。 Flux的工作原理您需要了解这两个接口

   public interface Publisher<T> {
       void subscribe(Subscriber<? super T> var1);
   }

   public interface Subscriber<T> {
       void onSubscribe(Subscription var1);
 
       void onNext(T var1);
 
       void onError(Throwable var1);

       void onComplete();
}
公共接口发布程序{

void subscribe(订阅者您可以使用
doOnEach
为给定流中使用的每个元素添加副作用,而无需修改发布者(错误和完成)

另外,对于不同的生命周期,也有很多重载,比如doOnError、doOnSuccess、doOnNext

,您可以在那里找到所有运算符和这些运算符的说明

更新:

根据你的最新情况,你可能会考虑交叉切割问题。 您可以使用
Hooks
在组装时修改反应流操作符


您可以使用doOnNext回调来拦截发布者推送下一个元素的操作。但是使用subscribe而不是block

generateFlux()
.doOnNext(next => System.out.println("Next Element pushed by publisher" + next))
.subscribe();

您可以使用subscribe签名,该签名覆盖onNext、onError和onCompleted的所有行为。subscribe方法在通量中重载了

我想了解一些信息,说明为什么这被否决了,因为我不知道我应该做些什么来改进问题。
  Flux.just("hello", "world")
                .doOnEach(item -> System.out.println(item))
                .blockLast();
generateFlux()
.doOnNext(next => System.out.println("Next Element pushed by publisher" + next))
.subscribe();