scala基础语法
1.变量
val:常量 & var:变量
val定义之后值不可变
scala> val name = "joey"
name: String = joey
scala> name
res0: String = joey
scala> name = "karol"
<console>:8: error: reassignment to val
name = "karol"
^
scala> name
res1: String = joey
var定义后值可变
scala> name
res1: String = joer
scala> var age = 17
age: Int = 17
scala> age
res2: Int = 17
scala> age = 18
age: Int = 18
scala> age
res3: Int = 18
定义多个变量:
scala> var num1,num2 : Double = 0
num1: Double = 0.0
num2: Double = 0.0
2.数据类型:
Scala中没有Java中的原生类型,以下数据类型全部都是对象
和Java相同的八大数据类型,但第一个字母都是大写
Byte,Short,Int,Long,Float,Double,Char,Boolean
和Java不同的数据类型
String,Nothing,Unit,Any,Null
注:
Nothing:表示没有值
Unit:表示没有返回值,相当于void
Null:空值或空引用
Any:任何类型
3.String类型的声明
val str = "我是字符串"
若字符串中有特殊符号,可用转义
val str2 : String = "我是/"字符串/""
也可以使用三个双引号,里面可以包含所有符号,包括换行符
val str3 : String = """ 我是"字符串""""
4.自动类型推断
scala可根据变量的赋值类型来自动推断变量的类型
如上例中:
var age = 18
根据18为Int类型,自动推断age为Int类型
val name = "joey"
根据"joey"为String,自动推断name为String类型
也可以像java一样定义变量的类型,写法略有不同:
scala> var money : Float = 100
money: Float = 100.0
scala> money
res4: Float = 100.0
scala> money = 101
money: Float = 101.0
若不定义money的类型,会自动推断为Int:
scala> val money = 100
money: Int = 100
若想要自动推断为Float,需要这样定义:
scala> val money = 100f
money: Float = 100.0
5.类型的判断与转换
常用的两个API:isInstanceOf && asInstanceOf
isInstanceOf类型判断,返回Boolean:
scala> val x : String = "255"
x: String = 255
scala> x.isInstanceOf[Int]
res10: Boolean = false
asInstanceOf类型转换,与java强转类似:
scala> val x : Long = 255
x: Long = 255
scala> x.asInstanceOf[Int]
res13: Int = 255
如果不能强转的类型之间,会报ClassCastException,如:
scala> "333".asInstanceOf[Int]
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
除了这两个API之外,每种数据类型都会有toString,toInt之类的方法
6.lazy关键字
使用lazy关键字声明的变量,仅在第一次调用时,才初始化该变量,分配相应堆栈空间
使用场景多为读取一些大文件,或者产生IO的变量
如:
import scala.io._
lazy val line = fromFile("D:/data/....").mkString
执行到此时,不会初始化line变量,也不会进行IO操作
print(line)
当第一次调用line时,才会初始化变量,执行相关操作
7.scala的操作符
scala的操作符基本上和Java的一样,优先级也和java的一样
有几点特殊的地方:
a.不支持java中的三元操作符(?:),也不支持++/--
b.scala的操作符实质上就是对象的函数,如:
scala> val a = 1
a: Int = 1
scala> a + 1
res19: Int = 2
scala> a.+(1)
res20: Int = 2
所以反过来,类的函数也可以当作操作符来使用
scala> 1.to(4)
res23: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4)
scala> 1 to 4
res24: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4)
scala> 1.max(5)
res25: Int = 5
scala> 1 max 5
res26: Int = 5
c.scala几乎所有的操作符都是左连接(从左到右),只有":"结尾的操作符是右连接,如:
1 :: 2 :: 3 ::Nil
8.scala的表达式
每行以换行符作为结尾,也可以加上";"
scala的表达式的返回值就是最后一行的执行结果,如:
scala> val x = {
| print("hello")
| }
hellox: Unit = ()
scala> val x = {
| print("hello")
| "hello"
| }
hellox: String = hello
scala> val x = {
| print("hello")
| 234
| }
hellox: Int = 234