次のことを行うためのより短い/より良い方法はありますか:
mySeq.map { elmt =>
// do stuff
}
if (mySeq.isEmpty) {
// some other stuff
}
Ps : 私は PlayFramework を使用していますが、これはテンプレートで使用するためのものです。
次のことを行うためのより短い/より良い方法はありますか:
mySeq.map { elmt =>
// do stuff
}
if (mySeq.isEmpty) {
// some other stuff
}
Ps : 私は PlayFramework を使用していますが、これはテンプレートで使用するためのものです。
これはどう?
mySeq.headOption.map { _ =>
mySeq.map { elmt =>
// do stuff
}
}.getOrElse {
// some other stuff
}
私は最近、指定されたシーケンスが空でない場合にのみ HTML を生成するヘルパーを提案しました。このわずかなバリエーションをファイルに入れます。たとえば、次のようになりますHelpers.scala
。
package views.html.helper
import play.api.templates.Html
object nonEmptyOrElse {
def apply[T <: Seq[_]](t: T)(nonEmptyBlock: (T) => Html)(emptyBlock: => Html) = {
if (t.nonEmpty) nonEmptyBlock(t) else emptyBlock
}
}
テンプレートで次のように使用します。
@nonEmptyOrElse(mySeq) { seq =>
//doSomething with entire seq
} {
// do something else
}
編集:そして、ここに各要素をマップするバージョンがあります:
object mapOrElse {
def apply[T](t: Seq[T])(nonEmptyBlock: (T) => Html)(emptyBlock: => Html) = {
if (t.nonEmpty) t.map(nonEmptyBlock(_)) else emptyBlock
}
}
スコープ内に次の単純な拡張機能があります。
(Scala 2.10 の場合):
implicit class AnyExtensions[A] ( val x : A ) extends AnyVal {
def asSatisfying(p: A => Boolean): Option[A] =
if (p(x)) Some(x) else None
}
(Scala 2.9 の場合):
implicit def anyExtensions[A] (x : A) = new {
def asSatisfying(p: A => Boolean): Option[A] =
if (p(x)) Some(x) else None
}
次のようにコードを書き直すことができます。
mySeq
.asSatisfying{_.nonEmpty}
.map{
_.map{elmt =>
// do stuff
}
}
.getOrElse{
// some other stuff
}
私の実践では、この拡張機能は多くの場合に適用でき、非常に便利であることが判明しました。これは、式の途中にステートメントが必要であることに気付いた場合に優れていますif
。この拡張機能がなければ、一時変数を導入する必要がありました。次に例を示します。
List(1, 2, 3).mkString(", ").asSatisfying{_.nonEmpty}.getOrElse("Empty list")
結果は aString
1, 2, 3
になりString
Empty list
、リストが空の場合は a になります。