加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 源流上的Akka Streams mapConcat运算符

发布时间:2020-12-16 18:13:39 所属栏目:安全 来源:网络整理
导读:我正在阅读Akka流的文档,我遇到了mapConcat运算符,就像flatMap一样(至少在概念层面). 这是一个简单的例子: scala val src = Source.fromFuture(Future.successful(1 to 10))src: akka.stream.scaladsl.Source[scala.collection.immutable.Range.Inclusive,a
我正在阅读Akka流的文档,我遇到了mapConcat运算符,就像flatMap一样(至少在概念层面).

这是一个简单的例子:

scala> val src = Source.fromFuture(Future.successful(1 to 10))
src: akka.stream.scaladsl.Source[scala.collection.immutable.Range.Inclusive,akka.NotUsed] = Source(SourceShape(FutureSource.out(51943878)))

我期待源的类型是:

akka.stream.scaladsl.Source[Future[scala.collection.immutable.Range.Inclusive],akka.NotUsed]

为什么不是这样?

我对每行的类型的理解如下所示:

Source
  .fromFuture(Future.successful(1 to 10)) // Source[Future[Int]]
  .mapConcat(identity) // Source[Int]
  .runForeach(println)

但上面例子中的Source类型并不是我想象的那样!

解决方法

Source.fromFuture的签名是:

def fromFuture[O](future: Future[O]): Source[O,NotUsed]

在您的示例中,O的类型为scala.collection.immutable.Range.Inclusive,因此Source.fromFuture的返回类型为:

Source[scala.collection.immutable.Range.Inclusive,NotUsed]

Scala docs

这是一个演示map和mapConcat之间区别的例子:

def f: Future[List[Int]] = Future.successful((1 to 5).toList)

def g(l: List[Int]): List[String] = l.map(_.toString * 2)

Source
  .fromFuture(f)
  .mapConcat(g) // emits 5 elements of type Int
  .runForeach(println)

Source
  .fromFuture(f)
  .map(g) // emits one element of type List[Int]
  .runForeach(println)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读