2016-11-03 10 views
1

Try[Int]であり、Try[Option[Int]]ではないようにオプションを削除するにはどうすればよいですか?私の試みの内部オプションを削除する方法

val m = Map("a" -> "1a", "b" -> "2") 
Try(m.get("a").map(_.trim.toInt)) 
>>es17: scala.util.Try[Option[Int]] = Failure(java.lang.NumberFormatException: For input string: "1a") 
+0

コメント:「flapmapを使用する方法があれば」潜在的な失敗の理由を保存したいのですか(試してください)、結果に興味がありますか(オプション)?? – maasg

+0

「m」以外のものを手に入れようとすると、どんな結果が欲しいですか? 「m.get( "c")」と言ってください。 –

答えて

7

Map#getこの場合には、Stringを返します。これは、Option[String]を返しますが、あなたの代わりにMap#applyを使用することができます。

scala> Try(m("a").trim.toInt) 
res3: scala.util.Try[Int] = Failure(java.lang.NumberFormatException: For input string: "1a") 

scala> Try(m("b").trim.toInt) 
res4: scala.util.Try[Int] = Success(2) 

applyとにかく、あなたが探しているキーが存在しませんが、Tryはそれをキャッチする場合は例外をスローします。

+0

m.get( "a")を使用し続けると、このオプションを削除する方法はありますか? –

+0

@coolbreeze次に、 'Option'で' .get'を呼び出してください。しかし、それは明らかに短縮する方法があるときには、より多くのコードを追加するだけであり、有用な例外を保持します。 –

+0

フラップマップを使用する方法があるのだろうかと思っていましたか?あなたのソリューションは私のために働き、他の選択肢を知りたいだけです。 –

1

この答えは、コメントについて、より詳細に行く:

flapmap使用する方法があった場合、私は不思議でしたか?あなたのソリューションは私のために働き、他の選択肢を知りたいだけです。

あなたはおそらく聞いてきたように、OptionTryはモナドのインスタンスであり、モナドは計算の順序を表すには便利ですが、彼らは他のモナドで構成されていません。つまり、OptionTryを作成することはできません。我々は共通の地面を見つける必要があります。

OptionTryのセマンティクスの違いは、結果が存在しない場合の情報を含むTryです。

Try#toOptionを使用して、からOptionに行くことができます。

逆の場合、この情報を追加する必要があります。Optionに値が存在しない場合に失敗の理由を提供する必要があります。

val res: Try[Int] = for { 
    strValue <- optionToTry(m.get("a"), new NoSuchElementException("a")) 
    value <- Try(strValue.trim.toInt) 
} yield value 

次のように2つのTryのインスタンスを作成するために舞台裏でflatMapを使用する:このような何か:として

import scala.util.{Try, Success, Failure} 
def optionToTry[T](opt:Option[T], failure: => Throwable): Try[T] = opt match { 
    case Some(v) => Success(v) 
    case None => Failure(failure) 
} 

その機能の助けを借りて、我々は元の式を書き換えることができます

val res = optionToTry(m.get("a"), new NoSuchElementException("a")) 
        .flatMap(strValue => Try(strValue.trim.toInt)) 

安全でないマップゲッターを使用してコードを少しずつ保存できることに注意してください。

val res: Try[Int] = for { 
    strValue <- Try(m("a")) 
    value <- Try(strValue.trim.toInt) 
} yield value 

しかし、このバージョンは、JVMで例外を処理するコストを考えると、計算コストが高くなります。

関連する問題