Scala的表达式

# 语句 (statement) :一段可执行的代码
# 表达式 (expression) :一段可以被求值的代码,在 Scala 中一切都是表达式。
        - 表达式一般是一个语句块,可包含一条或者多条语句,多条语句使用 “{}” 包含,语句间以 “;” 分隔,称为块表达式
        - 表达式有返回值
表达式和语句有什么区别:
        1.表达式有返回值,语句被执行。表达式一般是一个语句块,执行后,返回一个值
scala> if(true) "true string" else "false string" 
res4: String = true string
scala> if(false) 5 else "hello" 
res5: Any = hello
2. 不使用 return 语句,最后一个表达式即返回值
scala> var i=0 //可以认为是var i={0} 
i: Int = 0 

scala> val a={ i=i+1 } //块表达式中最后一条赋值语句返回了"()"值,它是一个Unit类型 
a: Unit = () 

scala> val a={ i=i+1;i=i+1;i } //块表达式中最后一条语句返回i的值作为表达式的值 
a: Int = 2
如果用 return 会发生什么?
scala> if (i>10) 100 else -100 
scala> if (i>10) return 100 else return -100 
<console>:9: error: return outside method definition 
            if (i>10) return 100 else return -100

一、if分支条件表达式

if-else表达式有值,这个值就是跟在if或者else之后的表达式的值

1.1.单分支

基本语法
        if (条件表达式 ) { 执行代码块 }
说明:当条件表达式为 ture 时,就会执行 { } 的代码。
val x = 1
//如果缺失else,相当于if(x>2) 1 else () 
//返回类型是AnyVal 
//如果进行类型判断和转换,可以使用: 
//var b = if(m.isInstanceOf[Int]) m.asInstanceOf[Int] else 0 
val m = if(x>2) 1
println(m) 

//在scala中,每个表达式都有值,scala中有个unit类,写作(),相当于Java中的 void 
val n = if(x>2) 1 else ()
println(n)

1.2.双分支

基本语法
        if (条件表达式 ) { 执行代码块 1 } else { 执行代码块 2 }
说明:当条件表达式成立,即执行代码块 1 ,否则执行代码块 2
  
var x = 1 //将if/else表达式值赋给变量y 
val y = if (x > 0 ) 1 else -1 
println(y)

1.3多分支

基本语法
if ( 条件表达式 1 ) { 执行代码块 1 }
else if ( 条件表达式 2 ) { 执行代码块 2 }
……
else { 执行代码块 n }

示例:

//if 嵌套 
val k= if(x<0) 0 else if (x>=1) 1 else -1
println(k)

混合类型表达式

//支持混合型表达式 
//返回类型是Any 
val z = if(x>0) "success" else -1 
println(z)

小结:

# 1. 每个表达式都有一个类型
# 2. 条件表达式有值
# 3. 混合型表达式,结果是 Any 或者 AnyVal
# 4.Scala 没有 switch 语句,但是有更强大的模式匹配

二、循环表达式

Scala 中有 for 循环和 while 循环,用 for 循环比较多。

2.1.for循环

for 循环语法结构:
for(i < - 表达式 )
        i <- 表达式 称为生成器,可从集合中取出每个元素。与 Java 类似, 表达式 的值必须为可遍历的迭代器 Iterator[Any],包括数组、集合( Range List Seq…… )等。以 Range 为例, Range 表示一种区间类型,常用的两种创建方式为: to until
val (i,j)=(1,10) 
i to j //(包含i和j)
i.to(j) 
i until j // (包含i,但不包含j) 
i.until(j) 
for(n <- i to j) 
println(n)
for 循环嵌套 for 语句中可以有多个生成器
for (i < - 1 to 3 ; j < - 1 to 3) print ((10 * i +j) + " ")
        

for循环过滤器:也称循环守卫  

for (i <- 1 to 3; j <- 1 to 3; if (i != j)) print ((10 * i + j) + " ") 
for (i <- 1 to 3; j <- 1 to 3; if(i != j);if(j<3)) print ((10 * i + j) + " ") 
for (i <- 1 to 3; j <- 1 to 3 if i != j if j<3) print ((10 * i + j) + " ")
yield 循环体:也称 for 推导式。 Scala 中的 yield 的主要作用是记住每次迭代中的有关值,并逐一存入到一个数组中。
用法如下 :
for { 子句 } yield { 变量或表达式 }
lazy val retVal=for ( i <- 1 to 10; if i%2==0;if i>5 ) yield i 
for(a<-retVal){ 
    println(a); 
}
示例:
object ForDemo {
    def main(args: Array[String]){ 
    //每次循环将区间的一个值赋给i 
    for( i <- 1 to 10)
        println(i) 
    for( i <- 1 until 10)
        println(i)

    //for i <-数组 
    val arr = Array("a", "b", "c") 
    for( i <- arr) 
        println(i)

    val s = "hello" 
    for(i <- 0 until s.length){ 
        println(s(i)) 
    }
    // 或者 
    // for(c <- s)println(c) 
    // 或者 
    // for(i <- 0 until s.length){ 
    // println(s.charAt(i)) 
    // }

    //高级for循环(嵌套循环加过滤功能) 
    for(i <- 1 to 3 ; j<- 1 to 3 if i != j){ 
        print((10*i + j) + "") 
        println() 
    }
    //for推导式,如果for循环的循环体以yeild开始,则该循环会构建出一个集合或者数组,每次迭代生成其中 一个值。
    val v= for ( i <- 1 to 10 )
    yield i*10 println (v)
    } 
}

2.2while循环和do...while循环

while循环语法:

while (条件语句){表达式}

do...while循环语法

do{表达式}while(条件语句)

//求和 
//while实现 
val i=1 
var sum = 0 
while(i<=10){ 
    sum += i 
    i += 1 
}
println(sum) 
//do ... while实现 
do {
    sum += i 
    i += 1 
}while (i>=10)

2.3.循环停止的三种方式

# 1. 使用 return   不推荐,因为在方法里面,会把整个方法都结束了
# 2. 使用 Boolean 变量
# 3. 使用 breakable
示例:
object BreakLoopDemo { 
//方式1 return 不要应用于在main方法中 自定方法中的循环可以停止 
    def add():Unit = { 
        for (i <- 1 to 10) { 
            if (i == 7) { 
                return // 若使用return 需要注意:有返回值必须return 没有返回值必须在方法中表示出Unit才可 以使用return 
            }
            println(i) 
        } 
    }

    def main(args: Array[String]): Unit = { 
        //方式2 使用Boolean变量 这个方式只能使用在while或do-while中,for也行但是需要加守卫if 
        var flag = true 
        var n = 0 //计数 
        while(flag){ //死循环 
        //让n自增 
        n += 1 
        println(n) 
            if(n == 10){ 
                flag = false 
            } 
        }

        //for循环版 
        var flag1 = true 
        for(i <- 0 to 10 if flag){ 
            println(i) 
            if (i == 7){ 
                flag1 = false 
            } 
        }
        //方式3 使用breakable块 
        //Scala中是没有break和continue关键字 
        //想使用break,必须导入一个包 
        //正在Scala认为位置都可以导入包 _ 相当于Java导入包是的*         
        importscala.util.control.Breaks._ 
        breakable{ //使用break块
            for(i <- 1 to 10){ 
                if( i == 7){
                    break 
                }
            } 
        }
    } 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值