Scala的变量定义
- 变量定义
声明一个val变量类似与java的 public static final String 一致,一旦初始化不能改变,和java的泛型类似,Scala会帮我们进行类型推断
如下图所示,一个Scala大致如以下结构:
下面使用shell键入一个命令进行数字运算:
scala> 8 * 5+2
res0: Int = 42
可以使用res0,可以在后续继续操作这个变量
scala> 0.5 * res0
res1: Double = 21.0
进行字符串的拼接
scala> "hello,"+res1
res2: String = hello,21.0
可以使用res2调用方法,可以使用Tab键补全,例如输入res2.to可以提示如下选项:
tail takeWhile toBuffer toFloat toIterator toMap toStream toVector
tails to toByte toIndexedSeq toList toSeq toString transpose
take toArray toCharArray toInt toLong toSet toTraversable trim
takeRight toBoolean toDouble toIterable toLowerCase toShort toUpperCase
输入的内容被快速的编译为字节码,然后将这段字节码交由java虚拟机执行,这个过程称为读取-求助-打印-循环,即REPL(Read-Eval-Print Loop)
声明不可变变量:
scala> val helloWorld="hello World"
helloWorld: String = hello World
// 指定String类型进行创建
scala> val helloWorld:String="Hello World"
helloWorld: String = Hello World
//String其实就是java.lang.String
scala> val helloWorld:java.lang.String="Hello World"
helloWorld: String = Hello World
声明可变变量使用var
scala> var variable:String="mutable variable"
variable: String = mutable variable
scala> variable="haha"
variable: String = haha
下面使用延迟加载变量,相当于懒加载,初始化创建并不进行赋值当使用的时候才真正赋值
scala> lazy val scala="Hello Scala"
scala: String = <lazy>
//在真正使用时被赋值
scala> scala
res1: String = Hello Scala
在Scala中变量和函数的类型总是写在变量或函数名称的后面,java声明变量一般为:String hello ,而Scala为hello:String
也可以将多个值或变量放在一起声明:
// 声明x与y都为100
val x,y = 100
// 声明字符串常量greeting与hello为null
val greeting,hello : String = null
Scala常用数据类型和java一样,Scala也有7种数值类型:Byte,Char,Short,Int,Long,Float,Double以及一个Boolean类型,跟java不同的是这些类型为类,Scala并不刻意区分基本类型和引用类型可以对数字执行方法。
// 产生字符串
scala> 1.toString
res0: String = 1
// 类似与遍历
scala> 1.to(10)
res0: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
Scala不需要包装类型,它会自动进行基本类型与包装类型转换。Scala提供了RichInt,RichDouble,RichChar进行--Int,Double,Char中的转换
- 算术和操作符重载
> + - * / %等操作符完成,位操作符&|^ >> <<也一样,操作符实际上是方法。如a.+(b) 通常来说可以使用 a 方法 b 作为简写 a.方法(b)这里的方法是一个带有两个参数的方法(一个隐式和一个显式)例如1.to(10) 可以写成1 to 10 Scala并没有提供++和--操作,我们需要使用+=1或者-=1
在Scala中使用数学函数(min 或pow)更为简单-你不需要从某个类调用它的静态方法。sqrt(2),pow(2,4),min(2,pi)import scala.math_ 注意:_类似java中的* Scala没有静态的方法,它有个类似的特性,叫做伴生对象,其方法就跟java中的静态方法一样。举例来说,BigInt类的BigInt伴生对象有一个生成指定位数的随机素数的方法probablePrime:
scala> BigInt.probablePrime(100,scala.util.Random)
res1: scala.math.BigInt = 1181989405512407462125610683643
- apply方法
scala> "hello"(4)
res0: Char = o
"hello".apply(4) 简写为“hello”(4)同理还有很多类似用法例如,Array(4,4,9,16)会返回一个数组,用的就是Array伴生对象的apply方法。
项目中我们一般这样使用apply方法:如创建一个Student对象,我们这样做:
/**
* 学生类
*/
class Student extends Serializable {
/**
* 姓名
*/
@BeanProperty // 此注解实现了成员变量的setter方法和getter方法
var name: String = _
/**
* 年龄
*/
@BeanProperty
var age: Int = _
/**
* 所属年级
*/
@BeanProperty
var grade: String = _
// 重写的toString方法
override def toString = s"Student($name, $age, $grade)"
}
// 伴生对象
object Student {
// 这里有点类似java中的空参构造器初始化后给各个成员变量赋值的操作
def apply(name: String, age: Int, grade: String): Student = {
val student = new Student
student.name = name
student.age = age
student.grade = grade
student
}
// 运行的主函数,类似于java的main方法
def main(args: Array[String]): Unit = {
val s = Student("张三",23,"高三")
println(s) // 将输出 Student(张三, 23, 高三)
}
}