13

次のことを行うためのより短い/より良い方法はありますか:

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

if (mySeq.isEmpty) {
    // some other stuff
}

Ps : 私は PlayFramework を使用していますが、これはテンプレートで使用するためのものです。

4

5 に答える 5

15

これはどう?

mySeq.headOption.map { _ =>
  mySeq.map { elmt => 
    // do stuff
  }
}.getOrElse {
  // some other stuff
}
于 2012-08-21T08:56:56.700 に答える
4

私は最近、指定されたシーケンスが空でない場合にのみ 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
  }
}
于 2012-08-21T10:13:09.360 に答える
2

スコープ内に次の単純な拡張機能があります。

(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 になります。

于 2012-08-21T13:08:53.953 に答える