Scala的for循环

作者: 比轩 | 来源:发表于2018-09-14 09:25 被阅读14次

scala的for循环相比常规语言来变得异常强大,能够覆盖日常开发中的大多数循环迭代操作,整理如下:

普通迭代

普通迭代,使用操作符<-,类比于java的for :操作

List<File> fileHere = new File(".").listFiles();
for (File file : fileHere) {
    System.out.println(file);
}

用scala改下如下:

  // 1. <- generate 表达式
  val fileHere = new java.io.File(".").listFiles();
  for (file <- fileHere) {
    println(file)
  }

然后,从下面开始都算是scala比较特殊的操作了,java里没有类似的操作。

Range

使用to/until方法【注意:是方法,不是关键字】,创建了一个RangeRange是scala的一个对象,表示一个区间,和高中数学里的段概念一样。比如1 to 10返回的就是[1, 10]的段,1和10都可以取到。1 until 10表示的就是[1, 10)的概念,1可以取到,10取不到。

  // 2. generate expression 区间[Range] to until 等等
  for (i <- 1 until 4 )
    println(i)
  for (i <- 1 to 4)
    println(i)

上面的代码其实展开来说,本质上和下面的代码是一样的。

Range oneToTen = 1.to(10)
for (i <- oneToTen) {
  println(i)
}

过滤表达式if

在迭代的对象后面可以使用if关键字来对迭代的元素进行过滤,过滤条件可以使用多个,理解起来就像java8 Stream中的filter,多个if就是多个filter。最后,只有满足过滤条件的元素才会被成功迭代。

  // 3. 过滤表达式 多个if表达是and的关系,可以理解为两层filter,先过第一个,后过第二个
  for (file <- fileHere if file.isFile if file.getName.endsWith(".iml"))
    println(file)

嵌套

正常来说,使用常规的两层for循环嵌套并没有什么问题,但是大多数嵌套循环的场景其实都是为了获取到内部元素,而且嵌套的for容易导致金字塔式的代码,所以scala的嵌套语法糖从可读性上来说,是值得使用的。多层嵌套使用;分开,内层的迭代元素可以同时取到外层循环的元素和内层循环的元素,生命周期和常规的嵌套for循环一致。

  // 4. 嵌套for
  for (file <- fileHere if file.isDirectory; lineFile <- file.listFiles())
    println(lineFile.toString)

改写成java大概就是这样:

for (File file : fileHere) {
    if (file.isDirectory()) {
        for (File lineFile : file.listFiles()) {
            System.out.println(lineFile.toString());
        }
    }
}

yield关键字

按照scala的句法来说,for循环和while一样,返回值是Unit,也就是作为纯粹的控制结构来使用的,不存在返回值的问题,这点和scala的if对比就可以很明显的感觉到。但是,如果想聚合迭代的元素,就可以使用yield关键字。

注意:
在使用了yield关键字之后,for循环的结构就变成了这样:for (expression) yield {body},然后body的返回值会被聚合成为一个集合。

  // 5. yield 关键字
  val files = for (file <- fileHere if file.isFile) yield file
  for (file <- files) println(file)

  val numbers = for (i <- 1 to 10) yield i
  for (i <- numbers) print(i + ", ")

以上五个demo,输出如下:

1.========= base : 
./HelloWorld.iml
./out
./.idea
./src

2. =========Range :
1
2
3
1
2
3
4

3. ===========filter :
./HelloWorld.iml

 4. ==========double for :
./out/production
./.idea/uiDesigner.xml
./.idea/vcs.xml
./.idea/hydra.xml
./.idea/checkstyle-idea.xml
./.idea/workspace.xml
./.idea/modules.xml
./.idea/misc.xml
./src/base

 5.=========== yield keywords:
./HelloWorld.iml
1, 2, 3, 4, 5, 6, 7, 8, 9, 10

相关文章

  • Scala-简明速学01-控制语句

    Scala-简明速学01-控制语句 while循环 Scala中的while循环基本与Java相似,但是Scala...

  • Spark-shell&Scala(二)

    scala 循环 Scala循环中都没有 break和continue,所以用if条件了(for) for循环 s...

  • scala 循环

    for while do while

  • Scala for循环

  • Scala的for循环

    scala的for循环相比常规语言来变得异常强大,能够覆盖日常开发中的大多数循环迭代操作,整理如下: 普通迭代 普...

  • scala基础(2)

    scala控制结构 if条件表达式、while循环、for循环 if条件表达式 while循环 for循环 for...

  • Scala编程详解

    1.7 条件控制与循环 scala没有for循环,只能使用while循环替代for循环,或者使用简易版for循环 ...

  • Scala中for循环

    Scala中to和util中的区别 输出结果:Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 1...

  • scala之for循环

    循环方式 循环方式1:闭合 to 循环方式2:前闭合后开 util 循环守卫 保护式为true则进入循环体,否则则...

  • Scala如何实现break和continue

    Scala中没有Java/C/C++中的break和continue这样的关键字来控制循环,而我们在写Scala/...

网友评论

    本文标题:Scala的for循环

    本文链接:https://www.haomeiwen.com/subject/qhvngftx.html