纵横研究院后端基础技术专题社区

Scala的for循环

2018-09-14  本文已影响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
上一篇 下一篇

猜你喜欢

热点阅读