2017-07-30 35 views
0

誰でも私にmapflatMapのプロパティの使用例を教えてもらえますか?スカラ - マップとフラットマップの相違

Optionケースでは、これらの2つの方法がそれぞれの署名がdef map(A => B): Option[B]def flatMap(A => Option[B]): Option[B]であることがわかります。私はこの方法書くとき

scala> val a = Some(1).map(_ + 2) 
a: Option[Int] = Some(3) 

scala> val a2 = Some(1).flatMap(n => Some(n + 2)) 
a2: Option[Int] = Some(3) 

だから、私は二つの方法でいくつかの値を取得することができます、

def plusTwo(n: Int): Int = n + 2 
Some(1).map(plusTwo) 

def plusTwo(n: Int): Option[Int] = Some(n + 2) 
Some(1).flatMap(plusTwo) 

の間に違いがありますflatMapはfor-comprehensionに変換することができ、それはほとんどすべてのメソッドr eturn値Optionラップ?

答えて

0

あなたの関数plusTwoは、任意のIntに2を加えることができるので、すべての入力に対して有効な結果を返します。

None値が返されないため、Option [Int]を返すように定義する必要はありません。だからこそ、そのような関数をOption.mapで使用する理由

ただし、すべての関数がすべての入力に対して意味のある結果をもたらすわけではありません。たとえば、関数が関数のパラメータでいくつかの数値を除算する場合、その関数にゼロを渡すのは意味がありません。

のは、我々が機能を持っているとしましょう:

def divideTenBy(a: Int): Double 

は、あなたがゼロでそれを起動すると、その後はArithmeticExceptionがスローされます。次に、この例外をキャッチすることを覚えておく必要がありますので、関数のエラーを起こしにくいようにする方がよいでしょう。あなたはNoneを返すことができます「なし」オプション(左オペランド)の値または特定の機能を持つことができるので、あなたはflatMapを使用することができ、このような機能を持つ

def divideTenBy(a: Int): Option[Double] = if (a == 0) None else Some(10/a) 

scala> None.flatMap(divideTenBy) 
res9: Option[Double] = None 

scala> Some(2).flatMap(divideTenBy) 
res10: Option[Double] = Some(5.0) 

scala> Some(0).flatMap(divideTenBy) 
res11: Option[Double] = None 

は今、あなたは安全に任意の値に、この機能をマッピングすることができます

0

は、あなたがリストを持っているとしましょう:

val names = List("Benny", "Danna", "Tal") 
names: List[String] = List(Benny, Danna, Tal) 

は、今度はあなたの例で行きましょう。

def f(name: String) = if (name contains "nn") Some(name) else None 

マップ機能は、リスト内の各要素に関数を適用することで動作します:我々はオプション返す関数があるだろう。一方で

names.map(name => f(name)) 
List[Option[String]] = List(Some(Benny), Some(Danna), None) 

を、flatMapは返す関数を適用しますリスト内の各要素のシーケンス、および元のリストに結果を平ら

names.flatMap(name => f(name)) 
List[String] = List(Benny, Danna) 

あなたが見ることができるように、flatMapはいくつか/なし層を取り除き、唯一の起源を保持アルリスト。

関連する問題