在scala中更好的"迭代Seq或如果为空"的版本?

i.a*_*iel 13 scala playframework-2.0

是否有更短/更好的方法来执行以下操作:

mySeq.map { elmt => 
    // do stuff
}   

if (mySeq.isEmpty) {
    // some other stuff
}
Run Code Online (Sandbox Code Playgroud)

PS:我使用PlayFramework,这意味着在模板中使用,所以如果有任何"帮手"有我错过了,我会很高兴地发现那些;)

Jea*_*let 15

这个怎么样?

mySeq.headOption.map { _ =>
  mySeq.map { elmt => 
    // do stuff
  }
}.getOrElse {
  // some other stuff
}
Run Code Online (Sandbox Code Playgroud)

  • 它不完全紧凑:-) (2认同)

sen*_*nia 7

你可以使用match:

l match {
  case l if !l.isEmpty => l.map{ // do stuff }
  case _ => // some other stuff
}
Run Code Online (Sandbox Code Playgroud)

用于List:

l match {
  case h :: t => l.map{ // do stuff }
  case _ => // some other stuff
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以定义自己的方法:

import scala.collection.generic.CanBuildFrom
import scala.collection.TraversableLike

class FoldEmpty[T, S[T] <: TraversableLike[T, S[T]]](l: S[T]){
  def foldEmpty[B, That](notEmpty: T => B, empty: => That)(implicit cbf: CanBuildFrom[S[T], B, That]): That = 
    l match {
      case t if !t.isEmpty => l map notEmpty
      case _ => empty
    }
}

implicit def seqToFoldEmpty[T, S[T] <: TraversableLike[T, S[T]]](l: S[T]) = new FoldEmpty(l)
Run Code Online (Sandbox Code Playgroud)

用法:

scala> IndexedSeq(1, 2, 3).foldEmpty( _ + 1 , IndexedSeq(-1))
res0: IndexedSeq[Int] = Vector(2, 3, 4)

scala> IndexedSeq[Int]().foldEmpty( _ + 1 , Seq(-1))
res1: Seq[Int] = List(-1)
Run Code Online (Sandbox Code Playgroud)

  • `case h :: l`只有在`l`是`List`时才会匹配. (4认同)
  • 如果你先匹配空箱子,那么你就不需要了. (3认同)