3

次のようなコード セグメントがあります。

def test() : Seq[Int] = 
  List("A", "B", "C") collect {
    case "A" => 1
    case "B" => 2
    //case _ => println(_)
  }

ここで、結果のコレクションに要素を追加せずに、特定の値を (デバッグのためだけに) 出力に出力したいと思います。コメント行のコメントを外すと、Scala は式の値を に推測しますがSeq[Any]、これは完全に理解できます。

誰もこれを行う方法のヒントを得ましたか? 前もって感謝します!

4

3 に答える 3

9
def skipped: Nothing = throw new Exception("Oops, not skipped after all!")

List("A", "B", "C") collect {
  case "A" => 1
  case "B" => 2
  case x if { println(x); false } => skipped
}

object PrintSkip {
  def unapply(a: Any): Option[Any] = {
    println(a)
    None
  }
}

List(Some("A"), None, Some("C")) collect {
  case Some("A") => 1
  case None => 2
  case Some(PrintSkip(_)) => skipped
}
于 2012-05-27T17:51:02.857 に答える
8

flatMap

List("A", "B", "C") flatMap {
    case "A" => List(1)
    case "B" => List(2)
    case x => println(x); Nil
}

collect/flatten

List("A", "B", "C").collect {
    case "A" => Some(1)
    case "B" => Some(2)
    case x => println(x); None
}.flatten
于 2012-05-27T17:19:38.667 に答える
3

collect では、Option でラップする必要はありません。

List("A", "B", "C").collect(new PartialFunction[String, Int] {
  def apply(s:String):Int = s match {
    case "A" => 1
    case "B" => 2
  }

  def isDefinedAt(s:String) = {
    try {
      apply(s)
      true
    } catch {
      case e:MatchError => { println(s); false }
    }

  }
})
于 2012-05-27T17:42:46.527 に答える