Java 在每种元素被消耗后,在焊剂中添加副作用?
这是一个简化的例子,但它说明了这一点 假设我有一个定义如下的方法: 通量发生器通量(){ 返回Flux.just(“你好”,“世界”);/(S) } 例如,有没有一种方法可以使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实现,如果
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();