在Scala中组合find和instanceof的任何干净方法?

sca*_*1sk 4 functional-programming scala

我想在一些Iterable中找到一些符合某些给定类型的元素,并验证将该类型作为参数的谓词.

我使用命令式编程编写了这个方法,这似乎符合我的期望.有没有办法用更"scalaesque"的方式写这个?

def findMatch[T](it: Iterable[_], clazz: Class[T], pred: T => Boolean): Option[T] = {
  val itr = it.iterator
  var res: Option[T] = None
  while (res.isEmpty && itr.hasNext) {
    val e = itr.next()
    if (clazz.isInstance(e) && pred(clazz.cast(e))) {
      res = Some(clazz.cast(e))
    }
  }
  res
}
Run Code Online (Sandbox Code Playgroud)

小智 19

您可以使用collect,如果你想find,然后map.

scala> val it: Iterable[Any] = List(1,2,3,"4")            
it: Iterable[Any] = List(1, 2, 3, 4)

scala> it.view.collect{case s: String => s}.headOption
res1: Option[String] = Some(4)
Run Code Online (Sandbox Code Playgroud)

  • 应该注意的是,`case`语句当然可以包括一个警卫,以便只收集`pred`为'true`的元素. (2认同)