2015-05-17 31 views
1
val list1 = List(1,2,3,4,5,6) //Creating a dummy List 

val res1 = for(x <- list1 if x> 3) yield x 
// returns res1: List[Int] = List(4, 5, 6) 


val res2 = for(x <- list1) yield{ 
      if (x>3) x //Filtering out values lesser then 3 
      } 

//returns res2: List[AnyVal] = List((),(),(), 4, 5, 6) 
//Expected this to be List(4, 5, 6) 

上述產量如何根據「if」語句的位置返回不同的結果?斯卡拉產量發電機

回答

5

只有您的res1中的if充當過濾器res2中的if用作常規條件語句。

val res1 = for(x <- list1 if x> 3) yield x 

使用if作爲<-語句的右手邊的一部分過濾語句的值。

for(x <- list1) yield { if (x>3) x } 

一旦一個值到達yield塊,yield塊的結果將被返回,而不管它的類型如何。

在您的例子,res2具有產生的任UnitInt一個值,因爲在這種情況下if是具有用於任一if-then部或隱式else的值,而你的情況是Unit的表達式。