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来删除不需要的消息。在更复杂的代码中可能无法持续,但可以满足我的简单需求。希望将来会有一个更简单的方法来做这件事,然后我会更新。现在,我会接受你的回答,因为它可能会解决其他人的问题。谢谢