scala初学者,高手勿喷 O(∩_∩)O~
For 表达式
一、枚举集合类
代码:
val fileHere = (new java.io.File("c:\\")).listFiles
for(file <- fileHere)
println(file)
该语句把c盘根目录下的所有文件都列出来
或者也可以使用如下方法
//scala中不常见
for(i <- 0 to filesHere.length - 1)
println(filesHere(i))
不常见的原因是:集合对象本身可以被直接枚举,这样代码可以变得更短并回避了许多枚举数组时频繁出现的溢出越界等现象(off-by-one error)。枚举该从0还是1开始?最后的索引值应该加1还是-1,还是什么都不加?这些问题很容易回答,但也很容易出错。因此还是避免碰到为佳。
二、过滤
有时你并不想枚举集合的全部元素,而只是想取出某个子集。可以通过在for表达式的括号中添加if子句来实现。如下代码,实现了列出当前目录中以“.scala”结尾的文件名
val fileHere = (new java.io.File(".")).listFiles
for(file <- fileHere if file.getName.endsWith(".scala"))
println(file)
或者也可以采用如下写法:
for(file <- filesHere)
if(file.getName.endsWith(".scala"))
println(file)
需要的话可以包含更多的过滤器,只需要不断增加if子句即可。
例如,以下代码打印输出文件而不是目录:
for(file <- filesHere
if(file.isFile);
if(file.getName.endsWith(".scala")
)println(file)
注意:如果在发生器中加入超过一个过滤器,if子句必须用分号分隔
三、嵌套枚举
val filesHere = (new java.io.File(".")).listFiles
def fileLines(file: java.io.File) =
scala.io.Source.fromFile(file).getLines.toList
def grep(pattern:String) =
for(
file <- filesHere
if file.getName.endsWith(".scala");//注意这儿的分号
line <- fileLines(file)
if line.trim.matches(pattern)
)println(file + ": " + line.trim)
grep(".*gcd.*")