一、If…Else…
val x = 5
val s = if (x > 0) 1 else -1 // s 类型为Int
val m = if (x > 0) "positive" else -1 // s 类型为String和Int的公共超类型Any
// 在Scala中,每个表达式都应该有某种值。 如果else部分缺失了,以下语句相当于:if (x > 0) 1 else () ,这会返回一个空值。()表示Unit类
if (x > 0) 1
二、循环:While、For
① While循环:Scala中没有break或continue语句,当需要使用break功能时可以:使用Boolean型的控制变量、从嵌套函数当中return、使用Breaks对象的break方法
var n = 0
while (n < 10) {
println(n)
n += 1
}
② For循环:for (i <- 表达式),让变量i遍历 <- 右边的表达式的所有值。
for (i <- 1 to 10) {
println(i) // 1 2 3 4 5 6 7 8 9 10
}
for (i <- 1 until 10) {
println(i) // 1 2 3 4 5 6 7 8 9
}
③ 高级for循环:以 ‘变量 <- 表达式’ 的形式提供多个生成器,用分号将它们隔开
for (i <- 1 to 3; j <- 1 to 3) print ((10 * i +j) + " ") // 11 12 13 21 22 23 31 32 33
// 每个生成器都可以带一个守卫,以if开头的Boolean表达式
for (i <- 1 to 3; j <- 1 to 3 if i != j) print ((10 * i + j) + " ") // 12 13 21 23 31 32
// 引入可以在循环中使用的变量
for (i <- 1 to 3; from = 4 - i; j <- from to 3) print ((10 * i + j) + " ") // 13 22 23 31 32 33
// 如果for循环的循环体以yield开始,则该循环会构造出一个集合,每次迭代生成集合中的一个值
// for推导式。生成的集合与它的第一个生成器是类型兼容的。
val v = for (i <- 1 to 10) yield i%3
println(v) // Vector(1, 2, 0, 1, 2, 0, 1, 2, 0, 1)
三、异常:Exception
throw表达式有特殊的类型Nothing这在if/else表达式中很有用。如果一个分支的类型是Nothing,那么if/else表达式的类型就是另一个分支的类型
val q:Int = 10
if (q >= 0) {sqrt(q)} else throw new IllegalArgumentException("x should not be negative")
// 第一个分支类型是Double,第二个分支类型是Nothing。 因此,if/else表达式的类型是Double
四、Lazy
当val被声明为lazy时,它的初始化将被推迟,直到我们首次对它取值。
lazy val words= scala.io.Source.fromFile("words.txt") .mkString
// 读取文件并将内容拼接成一个字符串。由于是lazy类型,因此,如果程序中没有用到words,那么文件不会被读取
五、正则
要构造一个Regex对象, 用String类的r方法即可
如果正则表达式包含反斜杠或引号的话, 那么最好使用原始字符串语法:”“” “”“
val numPattern = "[0-9]+".r
val wsnumwsPattern = """\s+[0-9]+\s""".r
// findAllIn方法返回遍历所有匹配项的迭代器。可以在for循环中使用它
for (matchString <- numPattern.findAllIn("lib\\idea_rt.jar=8077:G:\\ideaIU\\IntelliJ IDEA 2017.1.4\\b" +
"in\" -Dfile.encoding=UTF-8 -classpath D:\\Java\\jre\\lib\\chars")) println(matchString)
// 要找到字符串中的首个匹配项, 可使用findFirstIn
val x = numPattern.findFirstIn("lib\\idea_rt.jar=8077:G:\\ideaIU\\IntelliJ IDEA 2017.1.4\\b" +
"in\" -Dfile.encoding=UTF-8 -classpath D:\\Java\\jre\\lib\\chars")
println(x.mkString) // 8077
// 耍检查是否某个字符串的开始部分能匹配, 可用findPrefixOf
val y = numPattern.findPrefixOf("lib\\idea_rt.jar=8077:G:\\ideaIU\\IntelliJ IDEA 2017.1.4\\b" +
"in\" -Dfile.encoding=UTF-8 -classpath D:\\Java\\jre\\lib\\chars")
println(y) // None
// 可以替换首个匹配项,或全部匹配项
numPattern.replaceFirstIn("lib\\idea_rt.jar=8077:G:\\ideaIU\\IntelliJ IDEA 2017.1.4\\b", "23")
//正则表达式组
val numitemPattern = "([0-9] +)([a-z] +)".r
val numitemPattern(num, item) = "99 bottles"