2016-09-24 15 views
0

私はここで間違ったオプションを使用しているように感じますが、getOrElseを正しく使用して状態が動作するようには見えません。オプションに問題がある

現在の悪いコード:

if (car.getWheel.isDefined) { 
    car.getWheel.get.getHubCap.isShinierThan(hubcap2) 
} 
else { 
    // Do nothing 
} 

私の代わりにif文のこの醜い組み合わせgetOrElseのような単純なものを使用したいと「に.get」を使用したいです。一致式はif文と同じことを行いますが、再び3行を取り、基本的にOptionを再作成します。 OptionにNonesに何もしない方法がありますか?

私の目標:このオプションにNoneが指定されていれば、コードの行をにすることはできません。。私はgetOrElseのいくつかのパラメータでgetHubCapを呼びたくはありません。

+0

http://www.scala-lang.org/api/current/#scala.Option –

答えて

4

あなたはmapを使用することができます。OptionSomeある場合にのみ

val result: Option[Boolean] = car.getWheel.map(_.getHubCap.isShinierThan(hubcap2)) 

map内のコードが実行されます。これは、Optionタイプを1つまたは複数の要素を持つリストとして扱います。空のリストにマップすると、空のリストが返されます。単一要素リストにマップすると、新しい単一要素リストが得られますが、値はマップされます

+0

getWheel残念ながら、単一の車輪を返しますが、また、私はマッピングが可能Nonesを取り除くでしょうか表示されないのですか? – sudom82

+0

涼しいですが、マップについては何を知りませんでした。ありがとう、答えとしてマーク。 – sudom82

0

マップを使用してケースを分離する傾向があります。 case _は、デフォルトのケースであり、前のケースのどれも一致しない場合に一致するため、重要である可能性があります。これにより、予測的な方法でコーディングし、すべてのエッジケースを処理できます。

ケース文でif句を使用して条件を追加することもできます。

val opt: Option[String] = Some("foo") 

val printString: String = opt match { 
    case Some(string) if string == "bar" => string 
    case Some(string) => string 
    case _ => "none" 
} 

println(printString) 
+1

これはうまくいきません - おそらく 'map'の代わりに' match'を意味し、どんな場合でも 'case _'は通常私のビューの反パターンです。すべてのケースを処理していないかどうかをコンパイラに伝えさせます。 –

+0

あなたは本当に間違いなく一致するように変更しました。 'case_'に関しては、私はそれのための場所があると思います。懸念されないすべてのケースを表すことができます。例えば、10の場合がありますが、最初のものだけを気にします。 – toidiu

関連する問題