2013-11-09 23 views
-1

我有下面的代碼:瞭解如何爲報表按地圖,flatMap代表和過濾

val e1 = 10 :: 15 :: 20 :: 25 :: Nil 
val e2 = 10 :: 15 :: 20 :: 25 :: Nil 

val y = for { 
    e <- e1 if(e%2==0) 
} yield e 

val y1 = e1.withFilter(x => (x%2 == 0)).map(Int=>Int) 

val e31 = for{ 
    i <- e1 
    j <- e2 if (isPrime(i+j)) 
} yield(i,j) 

現在你可以看到yy1兩者都讓我值完全相同,這證明我成功代表for聲明具有(單個生成器+過濾器)withFilter和map。

但是,當我有一個for語句與多個生成器和過濾器(例如:val e31),我無法找到如何用map,filterMap和withFilter表示。

回答

2
scala> val e31 = for{ 
    |  i <- e1 
    |  j <- e2 
    |  if ((i+j) % 2 == 0) 
    |  } yield(i,j) 
res1: List[(Int, Int)] = List((10,10), (10,20), (15,15), (15,25), (20,10), (20,20), (25,15), (25,25)) 


scala> e1.flatMap(i => e2.withFilter(j => ((i+j)%2 == 0)).map(j => (i,j))) 
res2: List[(Int, Int)] = List((10,10), (10,20), (15,15), (15,25), (20,10), (20,20), (25,15), (25,25)) 

看看this問題,瞭解如何爲每一個 - 構建翻譯更詳細的解答。

+0

感謝Marth。這真的幫助我理解這個概念。 –

1

實際上,有一種方法可以強制Scala編譯器向我們展示如何解析for解析。

例如,編譯此代碼時:

object dummy {  
    val e31 = for{ 
    i <- e1 
    j <- e2 
    if (isPrime(i+j)) 
    } yield(i,j) 
} 

scalac -Xprint:parser dummy.scala,你會得到:

[[syntax trees at end of     parser]] // dummy.scala 
package <empty> { 
    object dummy extends scala.AnyRef { 
    def <init>() = { 
     super.<init>(); 
    () 
    }; 
    val e31 = e1.flatMap(((i) => e2.withFilter(((j) => isPrime(i.$plus(j)))).map(((j) => scala.Tuple2(i, j))))) 
    } 
} 

的代碼有錯誤(各種標識符是不確定的),但它並不重要在這裏,因爲parser還沒有看到這些錯誤。