Scala系列(2)- 数据类型、条件表达式

235 阅读2分钟

1. 数据类型与操作符

1.1 数据类型

基础类型类型说明
Byte8位带符号整数
Short16位带符号整数
Int32位带符号整数
Long64位带符号整数
Char16位无符号Unicode字符
StringChar类型的序列(字符串)
Float32位单精度浮点数
Double64位双精度浮点数
Booleantrue或false

注意下 scala类型与Java的区别

[!NOTE]

  1. scala中所有的类型都使用大写字母开头
  2. 整形使用Int而不是Integer
  3. scala中定义变量可以不写类型,让scala编译器自动推断

1.2 运算符

类别操作符
算术运算符+、-、*、/
关系运算符>、<、==、!=、>=、<=
逻辑运算符&&、||、!
位运算符&、||、^、<<、>>
  • scala中没有,++、--运算符

  • 与Java不一样,在scala中,可以直接使用==!=进行比较值,比较引用值得时候,需要使用eq

参考代码

val str1 = "abc"
val str2 = str1 + ""
str1 == str2   true
str1.eq(str2)   false

1.3 scala类型层次结构

类型说明
Any所有类型的父类,,它有两个子类AnyRef与AnyVal
AnyVal所有数值类型的父类
AnyRef所有对象类型(引用类型)的父类
Unit表示空,Unit是AnyVal的子类,它只有一个的实例{% em %}() {% endem %}
它类似于Java中的void,但scala要比Java更加面向对象
NullNull是AnyRef的子类,也就是说它是所有引用类型的子类。它的实例是{% em %}null{% endem %}
可以将null赋值给任何对象类型
Nothing所有类型的子类
不能直接创建该类型实例,某个方法抛出异常时,返回的就是Nothing类型,因为Nothing是所有类的子类,那么它可以赋值为任何类型

2. 条件表达式

2.1 有返回值

[!NOTE]

  • 在scala中,条件表达式也是有返回值的
  • 在scala中,没有三元表达式,可以使用if表达式替代三元表达式
scala> val age:Int = 20
age: Int = 20
// 此时得result是可以接接收到值得,说明if表达式可以返回结果
scala> val result:Boolean = if(age == 20) true else false
result: Boolean = true

scala> print(result)
true

2.2 块表达式

  • scala中,使用{}表示一个块表达式
  • 和if表达式一样,块表达式也是有值的
  • 值就是最后一个表达式的值
// 1、因为没有最后一个表达式,所以返回为空
scala> val a = {
     | println("jack")
     | }
jack
a: Unit = ()

// 2、此时返回最后一个 1 + 1得值
scala> val b = {
     | println("haode")
     | 1 + 1
     | }
haode
b: Int = 2

3. 循环

3.1 for表达式

语法

for(i <- 表达式/数组/集合) {
    // 表达式
}

3.1.1 简单循环

遍历 1 到 10 得数字

// 1、我们可以先得到1 到10 得数字,然后再进行遍历
scala> val nums = 1.to(10)                                                              
nums: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) 
                                                                                        
scala> for(i <- nums) println(i)      

// 2、使用中缀调用法(后面得章节中会讲到,这里就先不给大家介绍啦)
scala> for(i <- 1 to 10) println(i)

3.1.2 嵌套循环

for(i <- 1 to 3; j <- 1 to 5) {print("*");if(j == 5) println("")}
结果:
*****
*****
*****

3.1.3 守卫

守卫就是可以在for表达式中添加if判断语句

语法

for(i <- 表达式/数组/集合 if 表达式) {
    // 表达式
}
// 添加守卫,打印能够整除3的数字
for(i <- 1 to 10 if i % 3 == 0) println(i)

3.1.4 for推导式

  • 将来可以使用for推导式生成一个新的集合(一组数据)

  • 在for循环体中,可以使用yield表达式构建出一个集合,我们把使用yield的for表达式称之为推导式

// for推导式:for表达式中以yield开始,该for表达式会构建出一个集合
scala> val a = for(i <- 1 to 10) yield i * 10
a: scala.collection.immutable.IndexedSeq[Int] = Vector(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)

3.2 while循环

scala中得while循环和java中得是一样得

scala> var i = 1
i: Int = 1

scala> while(i <= 10) {
     | println(i)
     | i = i+1
     | }

3.3 break和continue

  • 在scala中,类似Java和C++的break/continue关键字被移除了
  • 如果一定要使用break/continue,就需要使用scala.util.control包的Break类的breablebreak方法。

3.3.1 实现break

// 1、导入scala.util.control包下的Break
import scala.util.control.Breaks._
// 2、使用breakable将for表达式包起来
breakable{
    for(i <- 1 to 100) {
// 3、for表达式中需要退出循环的地方,添加`break()`方法调用
        if(i >= 50) break()
        else println(i)
    }
}

3.3.2 实现continue

// 1、导入scala.util.control包下的Break    
import scala.util.control.Breaks._
// 2、使用breakable将for的循环体包起来
for(i <- 1 to 100 ) {
    breakable{
        if(i % 10 == 0) break()
        else println(i)
    }
}