【问题标题】:Flowable.fromPublisher expects a Publisher, then why does it accept a Subscriber?Flowable.fromPublisher 需要一个 Publisher,那它为什么要接受一个 Subscriber?
【发布时间】:2021-07-28 18:30:21
【问题描述】:

方法签名是:

public static <T> Flowable<T> fromPublisher(Publisher<? extends T> source) {...}

但如果我编写这段代码,它会以某种方式工作:

Flowable<String> flowable = Flowable.fromPublisher(subscriber -> {
  subscriber.onNext("But onNext belongs in a subscriber...");
  subscriber.onNext("Which means I am passing a subscriber instead of a publisher");
  subscriber.onNext("What's happening?");
  subscriber.onComplete();
});

我知道我没有正确看待这个问题。有人可以解释传递 Subscriber 而不是 Publisher 的工作原理吗?

【问题讨论】:

    标签: java rx-java reactive-programming


    【解决方案1】:

    这一点:

    subscriber -> {
      subscriber.onNext("But onNext belongs in a subscriber...");
      subscriber.onNext("Which means I am passing a subscriber instead of a publisher");
      subscriber.onNext("What's happening?");
      subscriber.onComplete();
    }
    

    是一个 lambda 表达式,是 Publisher 的一个实现。您的代码等效于以下代码(使用匿名类):

    Flowable<String> flowable = Flowable.fromPublisher(new Publisher<String>() {
      @Override
      public void subscribe(Subscriber<? super String> subscriber) {
        subscriber.onNext("But onNext belongs in a subscriber...");
        subscriber.onNext("Which means I am passing a subscriber instead of a publisher");
        subscriber.onNext("What's happening?");
        subscriber.onComplete();
      }
    });
    

    【讨论】:

    • 哦,有趣!所以它是一个通过 lambda 表达式定义的匿名类。我不认为我以前见过这个。有没有我可以阅读的文档或任何具体示例?
    • This Oracle tutorial 涵盖了 lambda 表达式(和方法引用)。定义“功能接口”的实现时,lambda 表达式本质上是简写。函数式接口是只有一个抽象方法的接口(例如Publish,其单个抽象方法是#subscribe(Subscriber))。如果您研究 函数式接口lambda 表达式方法引用(在 Java 的上下文中),您应该能够找到您需要的任何说明.
    • @ritratt Java 8 中 lambda 的引入代表了语言风格的重大变化(以前过于繁琐而无法表示的东西变得可用),所以如果你想阅读任何现代 Java 代码,你需要熟悉它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多