Scala学习 -- for表达式

  Scala中的 for 表达式适用于迭代的瑞士军刀,它让你可以以不同的方式组合一些简单的因子来表达各种各样的迭代,它可以帮你处理诸如遍历整数序列的常见任务,也可以通过高级的表达式来遍历多个不同种类的集合,根据多个不同的条件过滤元素,产生新的集合。

 

遍历集合

  用 for 能做的最简单的事是遍历某个集合的所有元素。

val weeks = "Monday" :: "Tuesday" :: "Wednesday" :: "Thursday" :: "Friday" :: "Saturday" :: "Sunday" :: Nil
weeks: List[String] = List(Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday)

for(week <- weeks)
     println(week);

  通过 "week <- weeks" 这样的生成器语法,我们将遍历 weeks 的元素。每一次迭代,一个新的名为 week 的 val 都会被初始化成一个元素的值。

  for 表达式的语法可以用于任何种类的集合,而不仅仅是数组。Range(区间)是一类特殊的用例。可以用 “1 to 5”这样的语法来创建 Range,并用 for 来遍历它们。

for(i <- 0 to 5)
     println(i)
0
1
2
3
4
5

  如果你不想在被遍历的值中包含区间的上界,可以用 until 而不用 to

for(i <- 0 until 5)
     println(i)
0
1
2
3
4

  

过滤

  又是你并不想遍历完整的集合,你想把它过滤成一个自己。这是可以给 for 表达式添加 过滤器(filter),过滤器是 for 表达式的圆括号中的一个 if 子句。

 

weeks
res3: List[String] = List(Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday)

for(week <- weeks if !week.equals("Monday"))
     println(week);

Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday

 

  

  我们也可以用如下代码达到相同的目的

for(week <- weeks)
     if (!week.equals("Monday"))
         println(week);

Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday

  这段代码与前端代码交出的输出没有区别,可能看上去对于指令式编程背景的程序员来说更为熟悉。这种指令式的代码风格只是一种选项(不是默认和推荐的做法)。因为这个特定的 for 表达式被用作打印的副作用,其结果是单元值 ()。for 循环之所以被称作 "表达式",是因为它能返回有意义的值,一个类型可以由 for 表达式的 <- 子句据定的集合。

  

  for 中可以有更多的过滤器,直接添加 if 子句即可。

for(week <- weeks
    if !week.equals("Monday")
    if !week.equals("Tuesday")
)
     println(week);

Wednesday
Thursday
Friday
Saturday
Sunday

 

嵌套迭代

  如果你添加多个 <- 子句,你将得到嵌套的 “循环”。

val weeks = "Monday" :: "Tuesday" :: "Wednesday" :: "Thursday" :: "Friday" :: "Saturday" :: "Sunday" :: Nil;
val number = "A" :: "B" :: "C" :: "D" :: "E" :: "F" :: "G" :: Nil;

 for { item <- number
       if !item.equals("A");
       week <- weeks
       if !week.equals("Monday")
} {
      println(item + "、 "+ week);
}

B、 Tuesday
B、 Wednesday
B、 Thursday
B、 Friday
B、 Saturday
B、 Sunday
C、 Tuesday
C、 Wednesday
C、 Thursday
C、 Friday
C、 Saturday
C、 Sunday
D、 Tuesday
D、 Wednesday
D、 Thursday
D、 Friday
D、 Saturday
D、 Sunday
E、 Tuesday
E、 Wednesday
E、 Thursday
E、 Friday
E、 Saturday
E、 Sunday
F、 Tuesday
F、 Wednesday
F、 Thursday
F、 Friday
F、 Saturday
F、 Sunday
G、 Tuesday
G、 Wednesday
G、 Thursday
G、 Friday
G、 Saturday
G、 Sunday

 

产生一个新的集合

  虽然目前为止所有示例都是对遍历到的值进行操作然后忘掉它们,也完全可以在每次迭代中生成一个可以被记住的值。具体做法实在 for 表达式的代码体之前加上关键字 yield 。

scala> weeks
res13: List[String] = List(Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday)

scala> for(item <- weeks if item != "Monday") yield item
res12: List[String] = List(Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday)

  for 表达式的代码体每次被执行,都会产生一个值,本例中就是 file。当 for执行完毕之后,其结果将包含所有交出的值,包含在一个集合中。结果集合的类型基于迭代子句中处理的集合种类。

  要小心 yield 关键字的位置,for-yield 表达式的语法如下

for 子句 yield 代码体

  yield关键字必须出现在整个代码体之前。哪怕代码提示有花括号包起来的,也要将 yield 放在花括号之前,而不是在代码块最后一个表达式前面

for(XX <- XXX if XXXX) {
    yield file //语法错误
}

  

 

posted @ 2019-10-30 18:22  console.log('宇航')  阅读(188)  评论(0编辑  收藏  举报