习惯用于查找集合中与Scala中的给定子类型匹配的第一个元素

时间:2014-12-28 05:43:56

标签: scala scala-collections

我通过开发订单簿模型来自学Scala,Akka和Play。我需要找到与特定类型的Ask订单匹配的各种Ask订单的集合(特别是优先级队列)中的第一个元素(特别是LimitOrderAsk

我提出的解决方案如下:

bestLimitOrderAsk = askBook find {
  case ask: LimitOrderAsk => true
  case _ => false
}

我是scala的新手,我不确定这是解决这个问题的惯用Scala方法。想法?

1 个答案:

答案 0 :(得分:4)

两个选项:

 askBook.collectFirst{case ask: LimitOrderAsk => ask}  

或:

 askBook.find(_.isInstanceOf[LimitOrderAsk])

如果您只是需要知道,如果有一些元素(具有适当的类型) - 在表达式的末尾添加.nonEmpty

 askBook.collectFirst{case ask: LimitOrderAsk => ask}.nonEmpty
 askBook.exists(_.isInstanceOf[LimitOrderAsk])

示例:

scala> List(5, null, "aaa", "bbb").find(_.isInstanceOf[String])
res30: Option[Any] = Some(aaa)

scala> List(5, null, "aaa", "bbb").collectFirst{case a: String => a}
res31: Option[String] = Some(aaa)

布尔结果:

scala> List(5, null, "aaa").find(_.isInstanceOf[String]).nonEmpty
res32: Boolean = true

scala> List(5, null).find(_.isInstanceOf[String]).nonEmpty
res33: Boolean = false