2014-02-15 45 views
0

我想用它的名字来压缩月份的指数:如需退货单位

val res = for(i <- 1 to 12) { 
    val m = DateTime.parse(i.toString, DateTimeFormat.forPattern("mm").withLocale(Locale.US)) 
    yield (i, m.monthOfYear().getAsString) 
    } 

为什么resUnit

回答

3

也许这样做的更好的办法:

val res = (1 to 12) map { i => 
    val m = DateTime.parse(i.toString, DateTimeFormat.forPattern("mm").withLocale(Locale.US)) 
    (i, m.monthOfYear().getAsString) 
    } 

但你对不起作用,因为“产量”关键词应该是“为”外。

val res = for { 
    i <- 1 to 12 
    m = DateTime.parse(i.toString, DateTimeFormat.forPattern("mm").withLocale(Locale.US)) 
    } yield (i, m.monthOfYear().getAsString) 
+0

为什么在第一种情况下使用toList?这是不必要的。 –

+0

你是对的,'范围'是一个单子,并有它自己的地图方法 – psisoyev

6

您的理解应该是:

val res = for(
    i <- 1 to 12; 
    m = DateTime.parse(i.toString, DateTimeFormat.forPattern("mm").withLocale(Locale.US)) 
) yield (i, m.monthOfYear().getAsString) 

你给不编译的代码,但是如果你有以下形式的for表达

for(i <- 1 to 12) { 
    ... 
} 

这个被转换成

1.to(12).foreach(i => ...) 

它返回Unit,这就是为什么resUnit在您的代码。

您需要使用yield来创建投影。