在部分函数中使用match子句的collectFirst

时间:2014-11-13 10:02:07

标签: scala

我想知道是否以及如何在scala中的collectFirst子句中使用match子句。例如,我想做类似以下的事情:

myCollection collectFirst {
  case i =>
    otherCollection.find(_ == i + 1) match {
      case Some(j) => j
      case None => // Check the next i???
  }
}

注意我知道我可以在没有匹配子句的情况下实现上述逻辑但是这样做纯粹是为了解释目的

2 个答案:

答案 0 :(得分:1)

像这样?

val other = List(4)
List(1, 2, 3, 4) collectFirst {
  case i if other.contains(i) => s"other has $i"
}

res0: Option[String] = Some(other has 4)

  

注意我知道如果没有match子句我可以实现上述逻辑   但我这样做纯粹是出于解释目的

List(1, 2, 3, 4) collectFirst {
  case i if (other.find(_ == i) match {
    case Some(_) => true
    case None => false
  }) => s"other has $i"
}

请勿在您的代码中执行此操作!

答案 1 :(得分:0)

我定义了一个函数如下:

def mapFirst[A, B](seq: Seq[A])(f: A => Option[B]): Option[B] = seq match {
  case Seq(a, rest @ _ *) =>
    f(a) match {
      case Some(b) => Some(b)
      case None => mapFirst(rest)(f)
    }
    case _ => None
}

因此可以使用:

  mapFirst(myCollection) { i => 
    otherCollection.find(_ == i + 1) match {
      case Some(j) => Some(j)
      case None => None
    }
  }