如何使用flatMapConcat?

时间:2019-04-22 19:11:16

标签: scala akka-stream

我正在尝试使用flatMapConcat如下:

Source.empty
      .flatMapConcat {
        Source.fromFuture(Future("hello"))
      }
      .runWith(Sink.foreach(println))
      .onComplete {
        case Success(_) =>
          println()
        case Failure(e) =>
          println(s"Thrown ${e.getMessage}")
      }

编译器抱怨:

Error:(31, 26) type mismatch;
 found   : akka.stream.scaladsl.Source[String,akka.NotUsed]
 required: ? => akka.stream.Graph[akka.stream.SourceShape[?],?]
        Source.fromFuture(Future("hello")) 

我在做什么错了?

1 个答案:

答案 0 :(得分:2)

方法flatMapConcat具有以下签名:

def flatMapConcat[T, M](f: (Out) => Graph[SourceShape[T], M]): Repr[T]

,在处理SourceString中的一个f: String => Source(Iterable[String]) 的情况下,该函数应该具有以下功能:

Source.empty[T]

示例代码的另一个问题是flatMapConcat没有要处理的元素,因此后续的flatMapConcat将永远不会执行。

以下是使用Source来转换名称import akka.actor.ActorSystem import akka.stream.ActorMaterializer import akka.stream.scaladsl._ implicit val system = ActorSystem("system") implicit val materializer = ActorMaterializer() Source(List("alice", "bob", "jenn")). flatMapConcat{ name => Source(List(s"Hi $name", s"Bye $name")) }. runWith(Sink.foreach(println)) // Hi alice // Bye alice // Hi bob // Bye bob // Hi jenn // Bye jenn 中的每个元素的示例:

flatMapConcat

作为旁注,可以将上面示例中的mapConcat替换为https://openpyxl.readthedocs.io/en/stable/styles.html#named-styles,该签名希望使用更简单的功能签名:

Source(List("alice", "bob", "jenn")).
  mapConcat{ name => List(s"Hi $name", s"Bye $name") }.
  runWith(Sink.foreach(println))