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
方法【注意:是方法,不是关键字】,创建了一个Range
,Range
是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
网友评论