30

私のコードには、次のコード パターンが散らばっています。

val opt = somethingReturningAnOpt
if (opt.isDefinedAt) {
    val actualThingIWant = opt.get
}

これを簡単にする方法はありますか?(不必要に複雑で、コードのにおいがするようです)。理想的には、次のようになります。

if (Some(actualThingIWant) = somethingReturningAnOpt) {
   doSomethingWith(actualThingIWant)
}

そのようなことは可能ですか?

4

4 に答える 4

38

多分このようなもの:

somethingReturningAnOpt match {
  case Some(actualThingIWant) => doSomethingWith(actualThingIWant)
  case None =>
}

またはpstが示唆するように:

somethingReturningAnOpt.foreach { actualThingIWant =>
  doSomethingWith(actualThingIWant)
}

// or...

for (actualThingIWant <- somethingReturningAnOpt) {
  doSomethingWith(actualThingIWant)
}
于 2011-12-08T07:02:55.777 に答える
33

Option ラングリングの正規ガイドは、Tony Morris によるものです。

于 2011-12-08T07:55:21.563 に答える
10

または:

somethingReturningAnOpt.map(doSomethingWith(_))

次のように:

val str = Some("foo")
str.map(_.toUpperCase)

...flatMapの結果がdoSomethingWithOption 自体の場合に使用します。

val index = Option(Map("foo" -> "bar"))
index.flatMap(_.get("whatever"))        // Returns None :-)
index.map(_.get("whatever"))            // Returns Some(None) :-(
于 2011-12-08T07:17:21.983 に答える
5

次のコードは、後で使用しようとする限り、常に定義されているとは限らず、このコードはコンパイルされないため、if有用なことを行うことはできません。actualThingIWantactualThingIWant

val opt = somethingReturningAnOpt
if (opt.isDefinedAt) {
    val actualThingIWant = opt.get
}

したがって、デフォルト値を指定する必要があります。これは次の方法で実現できますgetOrElse

val thingIWant = opt.getOrElse(myDefaultValue)

またはactualThingIWant、 の本体の後にif置きたくない場合、つまり、オプションが定義されている場合にのみ何らかの副作用をトリガーしたい場合は、次のように記述できます。

opt.foreach{ thingIWant => 
  println(thingIWant)
}

または少し短い

opt.foreach(println)
于 2011-12-08T09:17:58.590 に答える