Можно ли печатать значения во время сбора без изменения типа возвращаемого значения?

У меня есть сегмент кода примерно так:

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

Теперь я хотел бы напечатать определенные значения (только для отладки) на выходе без добавления каких-либо элементов в результирующую коллекцию. Если я раскомментирую закомментированную строку, Scala выведет значение выражения на Seq[Any], что вполне понятно.

У кого-нибудь есть намеки, как это сделать? Заранее спасибо!

3 ответа

Решение

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
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
}

С коллекцией нет необходимости упаковывать вещи в опцию.

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 }
    }

  }
})
Другие вопросы по тегам