我开始使用 Java 9 Flow API,我发现并且不喜欢的第一件事是,当我们将订阅者实现传递给发布者时,我们似乎不能使用 lambda,就像我们可以使用 RxJava 一样
所以我必须定义和实现我自己的订阅者类
public class CustomSubscriber<T> implements Flow.Subscriber<T> {
protected Flow.Subscription subscription;
@Override
public void onSubscribe(Flow.Subscription subscription) {
this.subscription = subscription;
System.out.println("Subscription done:");
subscription.request(1);
}
@Override
public void onNext(T item) {
System.out.println("Got : " + item);
subscription.request(1);
}
@Override
public void onError(Throwable t) {
t.printStackTrace();
}
@Override
public void onComplete() {
System.out.println("Done");
}
}
然后把它传给我的出版商
SubmissionPublisher<String> publisher = new SubmissionPublisher<>();
publisher.subscribe(new CustomSubscriber<>());
这真的很冗长,据我了解,这是因为我们需要在onSubscribe
回调 中设置订阅
protected Flow.Subscription subscription;
以后用于onNext
继续排放subscription.request(1);
我仍然不明白为什么需要这种机制,但它避免了像我们在 RxJava 中那样使用 Lambda 作为这个例子
SubmissionPublisher<String> publisher = new SubmissionPublisher<>();
publisher.subscribe(item -> System.out.println("do something in the onNext"),
e -> System.out.println("do something in the onError"),
() -> System.out.println("Do something in the onComplete"));
我想这是不可能的,我不会错过任何东西,对吧?