上一章我们共同研究了for循环以及变种。这章我们围绕比较常用的几个其他控制语句学习。
首先,对for进行补充, For-Comprehensions
格式: for (s ) yield e
举例:
var range = 0.until(10)var m = for (p <- range if p > 5) yield pprintln(m);
结果:
Vector(6, 7, 8, 9)
下面我们根据官方例子来先大家展示一下,格式如下:
//A simple for-comprehensionfor (xe’)
意思就是说 for循环这种方式可以用于和map互换(如果你有java基础,应该知道map是什么)
首先,来看看具体官方例子:
for (p20) yield p.name
我们自己为他补全代码
class person (name1:String, age1 : Int) {var age = age1;var name = name1;}var persons : List[person] = List(new person("s",1),new person("a",2),new person("b",3));var n2 = for (p <- persons;if p.age > 1) yield p.nameprintln(n2);
打印结果会是
List(a, b)
根据结果,我们得到了p.age大于1的 所有person的name.即p.name
这种方式,很类似一个
var persons = Map(a -> 1, b -> 2, c -> 3)
通过键值对的方式取值。顺便学习下Map吧
var range1 = 1.until(4)var m1 = Map(1 -> 24, 2 -> 25, 3 -> 26)var n = for (p <- range1 if p > 1) yield m1(p)println(n)
结果是
Vector(25, 26)
for语句还可以更复杂点
var m = for { i <- 0.until(10)j <- 1.until(i)if i+j>5} yield (i, j)println(m)
还可以更复杂点,但目前够用了。 大家要理解for,从上一章到这一章基本够用了。下面补充其他的常用控制语句。
一 while
while (true) {//TODO do something}
会死循环,切记慎用,还可以这样
do{ //DO SOMETHING}while (true)
java程序员可能会犯的错误
var line = ""while ((line = readLine()) != "") //记住scala不支持这种方式,line会得不到值println("Read: "+ line)
二 match
var a = 1;var i = 0;a match {case 1 => i = 2case 2 => i = 5}println(i);
参数a 可以用一个函数的返回值替换
def match_re : Int={1}def match_1={var i = 0;match_re match {case 1 => i = 2println("i = 2");case 2 => i = 5println("i = 5");}
这里我们看到特殊符号 => 再一次出现, 用于 case when
三 if else
var a = 3if(a>3){println("3 success");}else if(a>2){println("2 success");}else{println("success");}