Scala深入学习之表达式与循环学习

简介: 笔记

一、表达式


(1)表达式

表达式:一个具有执行结果的代码块,结果是具体的值或者()

表达式和语句的区别:

  • 表达式有返回值,语句被执行。表达式一般是一个语句块,执行后,返回一个值。
  • 不使用return语句,最后一个表达式即返回值。

示例:

// 返回的就是string类型
scala> val res = if(true) "true result" else "false result"
res: String = true result
scala> val res = if(true) println("true result") else "false result"
true result
res: Any = ()
scala> var a = 1
a: Int = 1
// 返回的是Any
scala> val res = if(true) a+=10 else "false result"
res: Any = ()
// Scala表达式中不使用return语句
scala> val res = if(true) return "true result" else return "false result"
<console>:11: error: return outside method definition
       val res = if(true) return "true result" else return "false result"
                          ^
<console>:11: error: return outside method definition
       val res = if(true) return "true result" else return "false result"
                                                    ^


(2)条件表达式

单分支

基本语法:if(条件表达式){执行代码块},说明当条件表达式为true,就会执行{}的代码

scala> val x = 10
x: Int = 10
// 这里会有同学问,为什么返回的是AnyVal类型,不是Int类型
scala> val res = if(x>0) 1
res: AnyVal = 1
// 解释:上一行表达式等价于下一行的写法,else返回的是unit类型,所以结果返回的就是AnyVal
scala> val res = if(x>0) 1 else ()
res: AnyVal = 1

双分支

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

说明当条件表达式成立,即执行代码块1,否则执行代码块2

scala> val res1 = if( x>0 ) 1 else -1
res1: Int = 1

多分支

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

else if(条件表达式2){执行代码块2}

else {执行代码块n}

scala> val res2 = if(x>0) 10 else if(x<0) -1 else 0
res2: Int = 10
// 混合类型,就会返回Any类型
scala> val res2 = if(x>0) 10 else if(x<0) -1 else "failure"
res2: Any = 10

注意:


每个表达式都有一个类型

条件表达式都有值

混合类型表达式,结果是Any或AnyVal

Scala没有switch语句


(3)块表达式

块表达式:{一条或者多条语句},块表达式也是有返回值

返回值是块表达式中的最后一条语句的结果,最后一条语句是打印语句或赋值语句,返回值就是一个()

package expr
/**
 * @author : 蔡政洁
 * @email :caizhengjie888@icloud.com
 * @date : 2020/8/18
 * @time : 1:38 下午
 */
object BlockExpr {
  def main(args: Array[String]): Unit = {
    // 块表达式1
    val x = 0
    val res1 = {
      if (x<0) 1
      else if(x>=0) -1
      else "error"
    }
    println(res1)
    // 块表达式2
    val x1 = 1
    val x2 = 2
    val y1 = 1
    val y2 = 2
    val distance = {
      val dx = x2-x1
      val dy = y2-y1
      Math.sqrt(dx*dx+dy*dy)
    }
    println(distance)
  }
}
-1
1.4142135623730951


二、循环


(1)for循环

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

for循环语法结构:for (i <- 表达式/数组/集合)

to和until

  • i to j (包含i和j)
  • i until j (包含i,但不包含j)
package forDemo
/**
 * @author : 蔡政洁
 * @email :caizhengjie888@icloud.com
 * @date : 2020/8/18
 * @time : 6:50 下午
 */
object ForDemo1 {
  def main(args: Array[String]): Unit = {
    // 每次从集合中取一个值,赋值给循环变量
    for (i <- 1 to 10){
      println(i)
    }
    // 循环遍历一个数组
    val arr = Array("a","b","c","d")
    for (item <- arr){
      println(item)
    }
  }
}

运行结果:

1
2
3
4
5
6
7
8
9
10
a
b
c
d

(2)高级for循环

package forDemo
/**
 * @author : 蔡政洁
 * @email :caizhengjie888@icloud.com
 * @date : 2020/8/18
 * @time : 6:55 下午
 */
object ForDemo2 {
  // 循环的嵌套以及带守卫的循环
  def main(args: Array[String]): Unit = {
    // 循环嵌套
    for (i <- 1 to 3; j <- 1 to 3){
      println(10*i + j)
    }
    // 等价于
    println("----------等价于----------")
    for (i <- 1 to 3){
      for (j <- 1 to 3){
        println(10*i + j)
      }
    }
    // 带守卫的循环
    println("----------带守卫的循环----------")
    for (i <- 1 to 3; j <- 1 to 3 if i != 3){
      println(10*i + j)
    }
  }
}

运行结果:

11
12
13
21
22
23
31
32
33
----------等价于----------
11
12
13
21
22
23
31
32
33
----------带守卫的循环----------
11
12
13
21
22
23


(3)for推导

for推导,yield

通过yield开始的循环,叫for推导,会构建一个新的集合,新集合中的元素是遍历for循环中的集合,每次根据yield后面的表达式生成一个新的元素

package forDemo
/**
 * @author : 蔡政洁
 * @email :caizhengjie888@icloud.com
 * @date : 2020/8/18
 * @time : 7:03 下午
 */
object ForDemo3 {
  // for推导,yield
  def main(args: Array[String]): Unit = {
    // 通过yield开始的循环,叫for推导,会构建一个新的集合,新集合中的元素是遍历for循环
    // 中的集合,每次根据yield后面的表达式生成一个新的元素
    val result = for (i <- 0 until 10) yield i*10
    println(result)
  }
}

运行结果:

Vector(0, 10, 20, 30, 40, 50, 60, 70, 80, 90)


(4)while do-while循环

package whileDemo
/**
 * @author : 蔡政洁
 * @email :caizhengjie888@icloud.com
 * @date : 2020/8/18
 * @time : 7:20 下午
 */
object WhileDoWhileDemo {
  def main(args: Array[String]): Unit = {
    // 使用while完成求和(1,2,3,。。10)
    var i = 1
    var sum = 0
    while (i <= 10){
      sum += i
      i += 1
    }
    println(sum)
    // 使用do while完成求和(1,2,3,。。10)
    do {
      sum += i
      i += 1
    } while (i <= 10)
    println(sum)
  }
}

(5)if和布尔变量跳出循环

package whileDemo
/**
 * @author : 蔡政洁
 * @email :caizhengjie888@icloud.com
 * @date : 2020/8/18
 * @time : 7:26 下午
 */
object ContinueDemo {
  def main(args: Array[String]): Unit = {
    // 数组("aa.scala","-bb.java","cc.scala","dd.java","-ee.scala")
    // 查找以".scala"结尾但是不以"-"开始的的字符串
    val arr = Array("aa.scala","-bb.java","cc.scala","dd.java","-ee.scala")
    // 实现break功能
    var found = false
    var i = 0
    while (i < arr.length && !found){
      // 实现continue功能
      if(!arr(i).startsWith("-")){
        if (arr(i).endsWith(".scala")){
          found = true
          println(arr(i))
        }
      }
      i += 1
    }
  }
}

运行结果:

aa.scala


(6)breakable实现跳出循环

第五点可以通过if来实现continue功能,通过加一个布尔变量来实现break功能,同时也可以使用breakable关键字。在使用breakable之前要import scala.util.control.Breaks._

package whileDemo
import scala.util.control.Breaks._
/**
 * @author : 蔡政洁
 * @email :caizhengjie888@icloud.com
 * @date : 2020/8/18
 * @time : 7:46 下午
 */
object BreakableDemo {
  def main(args: Array[String]): Unit = {
    // 实现break的功能,如果i=5,终止循环
    breakable(
      for (i <- 0 until 10){
        if (i == 5){
          break()
        }
        println(i)
      })
    println("----------------------")
    // 实现continue的功能,如果i=5,终止本次循环
    for (i <- 0 until 10) breakable({
      if (i == 5){
        break()
      }
      println(i)
    })
  }
}

运行结果:

0
1
2
3
4
----------------------
0
1
2
3
4
6
7
8
9


相关文章
|
8天前
|
Scala 容器
Scala学习--day04--集合、常用方法、案例实操 - WordCount TopN、不同省份的商品点击排行
Scala学习--day04--集合、常用方法、案例实操 - WordCount TopN、不同省份的商品点击排行
|
8天前
|
消息中间件 分布式计算 大数据
Scala学习--day03--函数式编程
Scala学习--day03--函数式编程
|
8天前
|
Java Scala
Scala学习--day02---控制流、“九层妖塔—杨辉三角”
Scala学习--day02---控制流、“九层妖塔—杨辉三角”
|
8天前
|
Java 编译器 API
Scala学习--day01变量与数据类型、运算符
Scala学习--day01变量与数据类型、运算符
|
8月前
|
Java Scala C++
Scala选择和循环语法
Scala选择和循环语法
31 0
|
Scala
Scala【自定义while循环】
你用过自定义的while循环码? 真厉害了Scala
74 0
|
存储 算法 Java
Scala学习三-面向对象
前面我们已经学习了特质类似接口,其可以被继承,同时如果需要继承多个特质的话,则需要使用extends…with…进行继承。其类似java中的接口和抽象方法的结合体,但又比java中的其要强大,因为其可以定义抽象字段和普通字段、抽象方法和普通方法。而在java中接口中可以定义常量,不能定义变量。同时特质还可以继承class类,而在java中接口通常是用来实现的。 Object继承trait
117 0
Scala学习三-面向对象
|
Java Scala
Scala学习一
Scala中的方法与函数: 方法是属于类或者对象的,在运行时,它是加载到JVM的方法区中,而函数则是加载到JVM的堆内存中,同时可以将函数对象赋值给一个变量。函数是一个对象,继承自FunctionN,函数对象有apply、curried、toSting、tupled这些方法,而方法则没有。这是scala与java不同的地方。
82 0
Scala学习一
|
分布式计算 资源调度 Hadoop
基于mac构建大数据伪分布式学习环境(七)-部署Scala及Spark学习环境
本文主要讲解如何部署Scala与单机伪分布式Spark计算引擎
94 0