scalaにおけるmapとflatMapの浅い分析

2421 ワード

関数式言語では、関数は一等公民として、どこでも定義でき、関数内または関数外では、関数のパラメータと戻り値として、関数を組み合わせることができます.コマンドプログラミング言語は、関数ポインタのような方法で高次関数を実現することもできるため、関数式の最も主要な利点は主に可変性によるものである.可変の状態がなければ、関数は透明(Referenceal transparency)を参照し、副作用がない(No Side Effect).いずれの関数言語にもmap関数とfaltMapの2つの関数があります.例えばpythonは純粋な関数言語ではありませんが、この2つの関数もあります.例えばjdk 1.8以降はLambda式も加えられており、当然map関数もサポートされている.scalaのこの2つの関数の使い方を簡単に説明します.mapとflatMapをScala関数メカニズムの核心と呼ぶのは過言ではないという観点があるが,実際には一定の道理がある.実際に私たちが最も多く使用しているシーンは、データのmap操作やflatMap操作です.map関数の使い方は、その名の通り、1つの関数をmapに転送し、転送されたこの関数を利用して、集合の各要素を処理し、処理後の結果を返します.flatMapとmapの唯一の違いは、入力された関数が処理後に値を返すのはListでなければならないことであるが、これも理解に難くない.flatMapである以上、map以外にflatの操作は必然的にあるので、戻り値がListでなければflatを実行できないというステップが必要である.くだらないことはあまり言わないで、小さな例を見れば使い方がわかります.
object collection_t1 {

  def flatMap1(): Unit = {
    val li = List(1,2,3)
    val res = li.flatMap(x => x match {
      case 3 => List('a','b')
      case _ => List(x*2)
    })
    println(res)
  }

  def map1(): Unit = {
    val li = List(1,2,3)
    val res = li.map(x => x match {
      case 3 => List('a','b')
      case _ => x*2
    })
    println(res)
  }

  def main(args: Array[String]): Unit = {
    flatMap1()
    map1()
  }
}

コードrunを立ち上がり、最後に次のように出力します.
List(2, 4, a, b)
List(2, 4, List(a, b))