19

以下のコードを書くためのより良い方法はありますか?

val t = map.get('type).getOrElse(""); 
if (t != "") "prefix" + t;

次のようなインラインコードに興味がある

val t = map.get('type).getOrElse("").????
4

5 に答える 5

39

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("")

ただし、これはおそらく必要ありません。マップに空の文字列があるとは思わないようです。

于 2012-09-20T00:32:15.380 に答える
5

.getOrElseまた、場合によっては、複数の一般的な使用法を1回の.withDefaultValue呼び出しに置き換えることができることにも注意してください。

val map = complexMapCalculation().withDefaultValue("")

val t = map('type)

これは毎回行うべきことだとは言えませんが、便利な場合があります。

于 2012-09-20T01:36:28.137 に答える
1

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 = ""
于 2012-09-23T08:46:07.053 に答える
0

この本を読んでいるときに、コントローラーで定義されたこのコードスニペットを見つけました。これは、 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)
于 2014-04-11T13:48:05.180 に答える
0
 val t = map.getOrElse("type","") match {case value if value !="" => s"prefix${value}" case _ => ""} 
于 2021-05-16T13:20:48.857 に答える