Scala Akka streams-扔掉一条信息

Scala Akka streams-扔掉一条信息,scala,akka,akka-stream,Scala,Akka,Akka Stream,我有一个如下所示的流: case class T1 extends A case class T2 extends A case class T3 extends A val proc: Flow[A, B, Unit] = Flow[A] .map { case x: T1 => B() case x: T2 => B() case x: T3 => save_message(x)

我有一个如下所示的流:

case class T1 extends A 
case class T2 extends A
case class T3 extends A

val proc: Flow[A, B, Unit] =   Flow[A] .map {
         case x: T1 => B()
         case x: T2 => B()
         case x: T3 => 
               save_message(x)
               // now throw away the message
 }
 .transform(() => lastStage)

 val lastStage = ...
 def save_message(msg: A): Unit = ...

在这段代码中,我收到了一条基本类型为a的消息,如果它是派生类型T1或T2。然而,如果它是T3类型的,我只想把它扔掉,不想把它传递到最后一个阶段,只想继续下一条消息。如何执行此操作?

使用
收集
而不是
映射

case class T1 extends A 
case class T2 extends A
case class T3 extends A

val proc: Flow[A, B, Unit] =   Flow[A].collect {
         case x: T1 => B()
         case x: T2 => B()
 }
 .transform(() => lastStage)

 val lastStage = ...

使用
collect
而不是
map

case class T1 extends A 
case class T2 extends A
case class T3 extends A

val proc: Flow[A, B, Unit] =   Flow[A].collect {
         case x: T1 => B()
         case x: T2 => B()
 }
 .transform(() => lastStage)

 val lastStage = ...

谢谢你,维克多。这是可行的,只是在我的一个例子中,我需要对进入流的消息进行一些处理(存储),但我不需要将其发送到最后一个阶段。我稍微修改了这个问题来澄清这个问题。收集这个角盒上的扼流圈。听起来你可能想创建一个广播,在其中忽略一个分支中的T1s和T2s,并将它们发送到一个持续T3s的接收器,然后在另一个分支上丢弃T3s。谢谢。最后,我稍微修改了我的方法(使用了and和Option的组合来创建额外的状态),这样我就可以使用filterNot来删除不需要的消息。在更复杂的代码中可能无法持续,但可以满足我的简单需求。希望将来会有一个更简单的方法来做这件事,然后我会更新。现在,我会接受你的回答,因为它可能会解决其他人的问题。谢谢谢谢你,维克多。这是可行的,只是在我的一个例子中,我需要对进入流的消息进行一些处理(存储),但我不需要将其发送到最后一个阶段。我稍微修改了这个问题来澄清这个问题。收集这个角盒上的扼流圈。听起来你可能想创建一个广播,在其中忽略一个分支中的T1s和T2s,并将它们发送到一个持续T3s的接收器,然后在另一个分支上丢弃T3s。谢谢。最后,我稍微修改了我的方法(使用了and和Option的组合来创建额外的状态),这样我就可以使用filterNot来删除不需要的消息。在更复杂的代码中可能无法持续,但可以满足我的简单需求。希望将来会有一个更简单的方法来做这件事,然后我会更新。现在,我会接受你的回答,因为它可能会解决其他人的问题。谢谢