分支控制
让程序有选择的的执行,分支控制有三种:单分支、双分支、多分支
if-else
:
if (condition) {
xxx
} else if (condition) {
xxx
} else {
xxx
}
实现一个小功能:输入年龄,如果年龄小于18岁,则输出“童年”。如果年龄大于等于18且小于等于30,则输出“青年”,如果年龄大于30小于等于50,则输出”中年”,否则,输出“老年”。
object ScalaBranch { def main(args: Array[String]): Unit = { val age = 30 if ( age < 18 ) { println("童年") } else if ( age <= 30 ) { println("青年") } else if ( age <= 50 ) { println("中年") } else { println("老年") } } }
- scala中特殊一点,
if-else
语句也有返回值,也就是说也可以作为表达式,定义为执行的最后一个语句的返回值。 - 可以强制要求返回
Unit
类型,此时忽略最后一个表达式的值,得到()
。 - 多种返回类型的话,赋值的目标变量类型需要指定为具体公共父类,也可以自动推断。
- scala中没有三元条件运算符,可以用
if (a) b else c
替代a ? b : c
。 - 嵌套条件同理。
循环流程---for
for
循环,也叫for
推导式:
- 范围遍历:
for(i <- 1 to 10) {}
,其中1 to 10
是Int
一个方法调用,返回一个Range
。 - 范围
1 to 10
1 until 10
是包含右边界和不包含右边界的范围,也可以直接用Range
类。 - 范围步长
1 to 10 by 2
。 - 范围也是一个集合,也可以遍历普通集合:
for(i <- collection) {}
- 循环守卫:即循环保护式,或者叫条件判断式,循环守卫为
true
则进入循环体内部,为fasle
则跳过,类似于continue
。
写法:
for(i <- collection if condition) { }
等价于:
if (i <- collection) { if (condition) { } }
嵌套循环同理。嵌套循环可以将条件合并到一个for
中:
- 标准写法:
for (i <- 1 to 4) { for (j <- 1 to 5) { println("i = " + i + ", j = " + j) } }
- 等价写法:
for (i <- 1 to 4; j <- 1 to 5) { println("i = " + i + ", j = " + j) }
- 典型例子,乘法表:
for (i <- 1 to 9; j <- 1 to i) { print(s"$j * $i = ${i * j} \t") if (j == i) println() }
1) 基本语法
for ( 循环变量 <- 数据集 ) {
循环体
}
这里的数据集可以是任意类型的数据集合,如字符串,集合,数组等,这里我们还没有讲到集合,数组语法,请大家不要着急,先能演示例子,后面咱们详细讲。
/*java增强for循环 * for(Object obj:Array){ * sout(obj) * } * scala: * for(obj:Object<-Array){} * */ object ScalaLoop { def main(args: Array[String]): Unit = { for ( i <- Range(1,5) ) { // 范围集合 println("i = " + i ) } for ( i <- 1 to 5 ) { // 包含5 println("i = " + i ) } } }
循环守卫
循环时可以增加条件来决定是否继续循环体的执行,这里的判断条件我们称之为循环守卫
object ScalaLoop { def main(args: Array[String]): Unit = { for ( i <- Range(1,5) if i != 3 ) { println("i = " + i ) //1 2 4 } } }
循环步长
scala的集合也可以设定循环的增长幅度,也就是所谓的步长step
object ScalaLoop { def main(args: Array[String]): Unit = { for ( i <- Range(1,5,2) ) { println("i = " + i ) //1 3 } for ( i <- 1 to 5 by 2 ) { println("i = " + i ) } }
循环嵌套
for(i<-1 to 3 ){ for(j<-1 to 3){ println("i="+i+",j="+j) } } i=1,j=1 i=1,j=2 i=1,j=3 i=2,j=1 i=2,j=2 i=2,j=3 i=3,j=1 i=3,j=2 i=3,j=3 等同于 for(i<-Range(1,4);j<-Range(1,4)){ println("i="+i+",j="+j) }
引入变量
object ScalaLoop { def main(args: Array[String]): Unit = { for ( i <- Range(1,5); j = i - 1 ) { println("j = " + j ) } } } // 引入变量 for(i<-1 to 3){ val j=i-1 println(j) } //简化 for(i<-1 to 3;j=i-1){ println(j) }
思考一个问题: 你们学java的时候都学过杨辉三角,那如何只使用一次for循环实现九层妖塔呢?蒙了吧?什么是九层妖塔!
object scalaLoop1 { def main(args: Array[String]): Unit = { //1 //3 //5 //7 a1+(n-1)d 1+(n-1)*2 1+2n-2=2n-1 //空9-n个空格 for(i<-1 to 9){ val stars=2*i-1 val space =9-i println(" "*space+"*"*stars) } } //写法二 for(stars<-1 to 17 by 2;spaces=(17-stars)/2){ println(" "*spaces+"*"*stars) } }
循环返回值
scala所有的表达式都是有返回值的。但是这里的返回值并不一定都是有值的哟。
如果希望for循环表达式的返回值有具体的值,需要使用关键字yield
object scalaLoop2 { def main(args: Array[String]): Unit = { // 如果希望for循环表达式的返回值有具体的值,需要使用关键字yield val result=for(i<-1 to 3) yield { i*2 } println(result) } } Vector(2, 4, 6)
思考两个问题:
Ø 怎么全是问题?
Ø Java中的线程有yield方法,Scala中该如何调用?
Thread.`yield`()
while循环
基本语法
当循环条件表达式返回值为true时,执行循环体代码
while( 循环条件表达式 ) { 循环体 }
一种特殊的while循环就是,先执行循环体,再判断循环条件是否成立
do { 循环体 } while ( 循环条件表达式 )
2) while循环
import scala.io.{BufferedSource, Source} object Scala05_while { def main(args: Array[String]): Unit = { val source: BufferedSource = Source.fromFile("F:\\scala代码\\data\\word.txt") val value: Iterator[String] = source.getLines() while (value.hasNext){ println(value.next()) } source.close() } }
object ScalaLoop { def main(args: Array[String]): Unit = { var i = 0 while ( i < 5 ) { println(i) i += 1 } } }
3) do...while循环
object ScalaLoop { def main(args: Array[String]): Unit = { var i = 5 do { println(i) } while ( i < 5 ) } }
循环中断
scala是完全面向对象的语言,所以无法使用break,continue关键字这样的方式来中断,或继续循环逻辑,而是采用了函数式编程的方式代替了循环语法中的break和continue
//break(中断,跳出循环) //continue (继续下一次循环) public class TestFor { public static void main(String[] args) { for(int i=0;i<5;i++){ if(i==3){ continue; } System.out.println(i); //0 1 2 4 } } }
package 分支控制 import scala.util.control.Breaks //import scala.util.control.Breaks._ //scala是完全面向对象的语言,所以无法使用break, // continue关键字这样的方式来中断,或继续循环逻辑,而是采用了函数式编程的方式代替了循环语法中的break和continue //break采用面向对象的方式来代替,底层会抛出异常跳出for循环,外层应该捕获异常 object Scala06_while { def main(args: Array[String]): Unit = { Breaks.breakable{ for (i <- 1 to 5) { if (i == 3) { //不正确 // return //return Breaks.break() } println("i=" + i) } } println("main方法执行完毕") } }
object ScalaLoop { def main(args: Array[String]): Unit = { scala.util.control.Breaks.breakable { for ( i <- 1 to 5 ) { if ( i == 3 ) { scala.util.control.Breaks.break } println(i) } } } }