Scala Akka Streams合并过滤器和地图

时间:2016-04-03 06:31:18

标签: scala akka akka-stream

我想知道是否有任何方法可以优化以下Scala代码,因为它看起来效率不高。 基本上,我只想删除流中不是Tweet的任何对象,并将其映射到Tweet而不是Any

val tweetsFlow = Flow[Any].filter({
  case _: Tweet => true
  case _ => false
}).map({
  case tweet: Tweet => tweet
})

2 个答案:

答案 0 :(得分:8)

你可以使用collect方法,有些像这样

val tws = Vector(
  "foo",
  Tweet(Author("foo"), tms, "foo #akka bar"),
  1000L,
  Tweet(Author("bar"), tms, "foo #spray bar"),
  Tweet(Author("baz"), tms, "foo bar"),
  1
)

val tflow = Flow[Any].collect {
  case x: Tweet => x
}
Source(tws).via(tflow)

答案 1 :(得分:1)

由于您只对特定类型的过滤感兴趣,因此可以使用collectType

// case class Tweet(title: String)
// val mixedSource: Source[Any, NotUsed] = Source(List(Tweet("1"), 3, Tweet("2")))
val tweetsSource: Source[Tweet, NotUsed] = mixedSource.collectType[Tweet]
// tweetsSource.runForeach(println)
// Tweet("1")
// Tweet("2")