scala基础语法

2018-08-21  本文已影响0人  invincine

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
上一篇下一篇

猜你喜欢

热点阅读