Scala的数据类型分为值类型(基本数据类型)和引用类型,具体如下:
值类型
- Byte:8位有符号整数,取值范围是-128到127。
- Short:16位有符号整数,取值范围是-32768到32767。
- Int:32位有符号整数,取值范围约为-21亿到21亿。
- Long:64位有符号整数,取值范围非常大。
- Float:32位单精度浮点数。
- Double:64位双精度浮点数。
- Char:16位无符号字符,用于表示单个字符。
- Boolean:表示布尔值,只有 true 和 false 两个值。
引用类型
- String:用于表示字符串,是不可变的字符序列。
- Array:固定大小的数组,用于存储相同类型的数据。
- List:不可变的有序集合,元素类型可以是任意类型。
- Set:不可变的集合,元素唯一,不允许重复。
- Map:不可变的键值对集合,键是唯一的。
Scala还支持泛型类型,允许在定义数据类型时使用类型参数,以提高代码的复用性和灵活性。此外,Scala的数据类型系统是统一的,所有的数据类型都是对象,都可以调用方法和属性。
变量的定义
强类型语言:Java
int num=10;
char ch=”a”;
Double num2=11.11;
弱类型语言:JS、Scala
var x=111;
var y=11.11;
var z=”hello”;
val f=58;
var定义变量;val定义常量
object VariableTest {
def main(args: Array[String]) {
//使用val定义的变量值是不可变的,相当于java里用final修饰的变量
val i = 1
//使用var定义的变量是可变的,在Scala中鼓励使用val
var s = "hello"
//Scala编译器会自动推断变量的类型,必要的时候可以指定类型
//变量名在前,类型在后
val str: String = "world"
}
}
scala的算术操作符与java的算术操作符也没有什么区别,比如+、-、*、/、%等,以及&、|、^、>>、<<等。但是,在scala中,这些操作符其实是数据类型的方法,比如1 + 1,可以写做1.+(1)例如,1.to(10),又可以写做1 to 10scala中没有提供++、--操作符,我们只能使用+和-,比如num = 1,num ++是错误的,必须写做num += 1。2.4字符串的插值操作Scala中的三个字符串插值器:s、f、raws在任何字符串前加上s,就可以直接在串中使用变量了f除了 s 的功能外(不指定格式就和 s 一样),还能进行格式化输出,在变量后用 % 指定输出格式raw除了对字面值中的字符不做编码外,raw 插值器与 s 插值器在功能上是相同的scala> var name = "tom"//name: String = tomscala> var src = s"hello ${name}"//src: String = hello tomval name1 = "tom"val name2 = "jim"println(s"hello,${name1 +","+ name2}!")2.5条件表达式IfIf else(单分支)If else if else(多分支)def main(args: Array[String]): Unit = { val x = 1 //判断x的值,将结果赋给y val y = if (x > 0) 1 else -1 //打印y的值 println("y=" + y) //支持混合类型表达式 val z = if (x > 1) 1 else "error" //打印z的值 println("z=" + z) //如果缺失else,相当于if (x > 2) 1 else () val m = if (x > 2) 1 println("m=" + m) //在scala中每个表达式都有值,scala中有个Unit类,写做(),相当于Java中的void val n = if (x > 2) 1 else () println("n=" + n)}scala> val y = if(1>1) 1 else "error"y: Any = error当y的值类型既可能为Int又可能为String时,它的类型被定义为Any,是Int和String的父类。scala> val y = if(x>1) 1y: AnyVal = ()没有else时,会默认为else (),y的类型被定义为AnyVal2.6类型的转换val num = "11"val num_int = num.toIntprintln(num_int+22)2.7块表达式def main(args: Array[String]): Unit = { val x = 0 val result = { if(x < 0) 1 else if(x >= 1) -1 else "error" } println(result)}2.8循环语句2.8.1 for循环scala>for (i <- 1 to 10) println(i)打印1到10scala> 1 to 10res6: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)scala>for (i <- 1 until 10) println(i)打印1到9//包含开头不包含结尾scala> 1 until 10res0: scala.collection.immutable.Range = Range(1, 2, 3, 4, 5, 6, 7, 8, 9)遍历字符串:相当于java中的forescala> val str = "hello"str: String = helloscala> for(c <- str) println(c)hello通过下标遍历字符串:scala> for (i <- 0 until str.length) println(str.charAt(i))hello遍历数组:scala> val arr = Array(1,2,3,4,5,6)arr: Array[Int] = Array(1, 2, 3, 4, 5, 6)scala> for(a <- arr) println(a)123456通过下标遍历数组:scala> for(i <- 0 until arr.length) println(arr(i))123456双重循环:输出个位数与十位数不相同的两位数(个位、十位数均从1-3取值)scala> for(i <- 1 to 3;j <- 1 to 3 if i != j) println(i*10+j)121321233132数组操作:对数组中的每个数乘以10,生成一个新数组:scala> val arr = Array(1,2,3,4,5,6)arr: Array[Int] = Array(1, 2, 3, 4, 5, 6)for(i<- arr)println(i*10)for(i<- 0 until arr.length)println(arr(i)*10)更简单的方法:scala> for (i <- arr) yield i*10res4: Array[Int] = Array(10, 20, 30, 40, 50, 60)for 循环中的 yield 会把当前的元素记下来,保存在集合中,循环结束后将返回该集合。Scala 中 for 循环是有返回值的。如果被循环的是 Map,返回的就是Map,被循环的是 List,返回的就是 List,以此类推。scala> arr.map(_ * 10)res8: Array[Int] = Array(10, 20, 30, 40, 50, 60)scala> arr.map(x => x *10)res9: Array[Int] = Array(10, 20, 30, 40, 50, 60)把数组中的偶数取出来乘以100得到一个新的数组for(i<- arr if i%2 ==0)println(i*100)for(i<- 0 until arr.length if arr(i)%2==0)println(arr(i)*100)更简单的方法:scala> for (i <- arr if i%2==0) yield i*100res11: Array[Int] = Array(200, 400, 600)scala> arr.filter(m => m%2==0).map(n => n*100)res12: Array[Int] = Array(200, 400, 600)