以下のコードを書くためのより良い方法はありますか?
val t = map.get('type).getOrElse("");
if (t != "") "prefix" + t;
次のようなインラインコードに興味がある
val t = map.get('type).getOrElse("").????
以下のコードを書くためのより良い方法はありますか?
val t = map.get('type).getOrElse("");
if (t != "") "prefix" + t;
次のようなインラインコードに興味がある
val t = map.get('type).getOrElse("").????
Map
独自のgetOrElse
メソッドがあるため、次のように記述できます。
val t = map.getOrElse('type, "")
t
これは、最初の例の定義と同じことを実現します。
コメントに対処するには:マップに値として空の文字列が含まれないことがわかっている場合は、次を使用して"prefix"
:を追加できます。
map.get('type).map("prefix" + _).getOrElse("")
または、Scala 2.10を使用している場合:
map.get('type).fold("")("prefix" + _)
マップに値を含めることができる""
場合、このバージョンはそれらの値にプレフィックスを追加するため、実際のバージョンとは少し異なる動作をします。ワンライナーでのバージョンとまったく同じ動作が必要な場合は、次のように記述できます。
map.get('type).filter(_.nonEmpty).map("prefix" + _).getOrElse("")
ただし、これはおそらく必要ありません。マップに空の文字列があるとは思わないようです。
.getOrElse
また、場合によっては、複数の一般的な使用法を1回の.withDefaultValue
呼び出しに置き換えることができることにも注意してください。
val map = complexMapCalculation().withDefaultValue("")
val t = map('type)
これは毎回行うべきことだとは言えませんが、便利な場合があります。
Scalaz Zero型クラスを使用して、コードを次のようにすることもできます。単項演算子はOptionWで定義されています。
val t = ~map.get('type) // no prefix
val t = ~map.get('type).map("prefix"+_) // prefix
セッションの例を次に示します。
scala> import scalaz._; import Scalaz._
import scalaz._
import Scalaz._
scala> val map = Map('type -> "foo")
map: scala.collection.immutable.Map[Symbol,java.lang.String] = Map('type -> foo)
scala> ~map.get('type)
res3: java.lang.String = foo
scala> ~map.get('notype)
res4: java.lang.String = ""
scala> ~map.get('type).map("prefix"+_)
res5: java.lang.String = prefixfoo
scala> ~map.get('notype).map("prefix"+_)
res6: java.lang.String = ""
この本を読んでいるときに、コントローラーで定義されたこのコードスニペットを見つけました。これは、 getOrElsePlay for Scala
のより良い構文である可能性があります。
def show(ean: Long) = Action { implicit request =>
Product.findByEan(ean).map { product =>
Ok(views.html.products.details(product))
}.getOrElse(NotFound)
}
ここで、Product.findByEan(ean:Long)は次のように定義されています。
def findByEan(ean: Long) = products.find(_ean == ean)
val t = map.getOrElse("type","") match {case value if value !="" => s"prefix${value}" case _ => ""}