29

Option[T]for some 型Tを使用していて、オプションの値を特定の値に対してテストしたいと思うことがよくあります。例えば:

val opt = Some("oxbow")
if (opt.isDefined && opt.get == "lakes") 
   //do something

次のコードは同等で、オプションの値の存在をテストする要件を削除します。

if (opt.map(_ == "lakes").getOrElse(false))
 //do something

しかし、これは私には読みにくいようです。その他の可能性は次のとおりです。

if (opt.filter(_ == "lakes").isDefined)

if (opt.find(_ == "lakes").isDefined) //uses implicit conversion to Iterable

しかし、これらが意図を明確に表現しているとは思いません。

if (opt.isDefinedAnd(_ == "lakes"))

誰かがこのテストを行うためのより良い方法を持っていますか?

4

6 に答える 6

44

どうですか

if (opt == Some("lakes"))

これは意図を明確に表し、単純明快です。

于 2009-10-23T07:46:22.823 に答える
24

Scala 2.11の場合、使用できますSome(foo).contains(bar)

于 2014-06-30T17:13:20.350 に答える
16

Walter Chang FTW ですが、別の厄介な代替手段を次に示します。

Some(2) exists (_ == 2)
于 2009-10-23T13:39:16.457 に答える
5
val opt = Some("oxbow")
opt match {
  case Some("lakes") => //Doing something
  case _ => //If it doesn't match
}
于 2009-10-28T03:22:37.843 に答える
1

for-comprehension も使用できます。

for {val v <- opt if v == "lakes"}
  // do smth with v
于 2009-10-23T10:05:56.423 に答える
-1

パターンマッチングも使えると思います。そうすれば、興味深い値を直接抽出できます。

val opt = Some("oxbow")
opt match {
  case Some(value) => println(value) //Doing something
}
于 2009-10-23T10:14:36.350 に答える