惯用的方法是在集合中查找与Scala中给定子类型匹配的第一个元素

惯用的方法是在集合中查找与Scala中给定子类型匹配的第一个元素,scala,scala-collections,Scala,Scala Collections,我通过开发订单簿的模型来自学Scala、Akka和Play。我需要找到集合中的第一个元素,特别是各种类型的询问顺序的优先级队列,它与特定类型的询问顺序相匹配,特别是LimitOrderAsk 我提出的解决方案如下: bestLimitOrderAsk = askBook find { case ask: LimitOrderAsk => true case _ => false } 我是scala新手,我不确定这是否是解决这个问题的惯用scala方法。想法?有两种选择:

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

我提出的解决方案如下:

bestLimitOrderAsk = askBook find {
  case ask: LimitOrderAsk => true
  case _ => false
}
我是scala新手,我不确定这是否是解决这个问题的惯用scala方法。想法?

有两种选择:

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

如果您只需要知道,表达式末尾是否有具有适当类型的元素-add.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
没有意识到有第一种方法!凉的我想我会使用u.isInstanceOf选项。而不是.find…nonEmpty,最好使用.exists。。。对于布尔型。
scala> List(5, null, "aaa").find(_.isInstanceOf[String]).nonEmpty
res32: Boolean = true

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