scala概述
scala是一门多范式编程语言,集成了面向对象编程和函数式编程等多种特性。
scala运行在虚拟机上,并兼容现有的Java程序。
Scala源代码被编译成java字节码,所以运行在JVM上,并可以调用现有的Java类库
scala解释器的使用
1,REPL:Read(取值) ->Evaluation(求值)->Print(打印)->Loop(循环);
Scala解释器也被称为REPL,会快速编译scala代码为字节码,然后交给JVM来执行
2,计算表达式:在scala命令行内,键入scala代码,解释器会直接返回给结果给你,如果你没有指定变量存储这个值,那么值默认的名称是res,而且会显示结果的数据类型,例如:int、Double、java.lang.String等。
例如输入:1+1
运行结果:
3,内置变量:在后面可以继续使用res这个变量,以及它存放的值。
例如:2.0*res0
运行结果:
例如:”HI” + res0
运行结果:
4,自动补全:在scala命令行内,可以使用tab键进行自动补全
例如:输入res2.to,按tab键,解释器会显示如下选项
因为此时无法判断你要选择的是哪一个,所以都列了出来,如果输入res2.toU,按下tab键会自动补全toUpperCase
声明变量
声明val变量:可以声明val变量来存放表达式的计算结果
例如val result =1+1
后续这些常量可以继续使用,例如:2*result
但是常量声明后是无法改变,例如,result =1,会返回如下错误
声明var变量:如果声明值可以改变的引用,可以使用var声明,例如var myRes =1,myRes=2,
运行结果:
但是在scala程序中建议使用val,也就是常量,因此类似于Spark大型复杂系统中,需要大量的网络传输数据,如果使用var,可能会被错误的更改
指定类型:无论声明的是val变量还是var变量,都可以手动的指定其类型,如果不指定的化,scala会自动根据值,进行类型的指定。
例如 val name: String =null
声明多个变量:可以将多个变量放到一起进行声明
例如:val name1,name2 : String =null
数据类型与操作符
数据类型 | 描述 |
Byte | 8位有符号补码整数。数值区间为 -128 到 127 |
Short | 16位有符号补码整数。数值区间为 -32768 到 32767 |
Int | 32位有符号补码整数。数值区间为 -2147483648 到 2147483647 |
Long | 64位有符号补码整数。数值区间为 -9223372036854775808 到 9223372036854775807 |
Float | 32位IEEE754单精度浮点数 |
Double | 64位IEEE754单精度浮点数 |
Char | 16位无符号Unicode字符, 区间值为 U+0000 到 U+FFFF |
String | 字符序列 |
Boolean | true或false |
Unit | 表示无值,和其他语言中void等同。用作不返回任何结果的方法的结果类型。Unit只有一个实例值,写成()。 |
Null | null 或空引用 |
Nothing | Nothing类型在Scala的类层级的最低端;它是任何其他类型的子类型。 |
Any | Any是所有其他类的超类 |
AnyRef | AnyRef类是Scala里所有引用类(reference class)的基类 |
乍一看与Java的基本数据类型的包装类相同,但是scala没有基本数据类型和包装类型的概念,统一都是类,scala自己会负责基本数据类型和引用类型的转换操作。
使用以上类型,直接就可以调用大量的函数,例如:1 toString ,1 to(10)
典型的加强版类型,scala使用很多加强类给数据类型增加了上百种增强的功能或函数,例如:String 类通过StringOps类增强了大量函数,”Hello”.intersect(“World”),
运行结果
Scala运算符与Java一样,不过scala运算符实际是一种方法, Scala中没有提供++,--操作符,只提供+=和-=
例如:res=1,res++是错误的,必须用res+=1
函数调用与apply函数
函数调用方式:在scala中,函数调用也很简单
例如:import scala.math_ ,sqrt(2),pow(2,4),min(3,Pi)
不同的一点是,scala在调用函数时,如果函数不需要传递参数,scala是可以省略括号的,例如 “Hello World”.distinct
apply 函数:scala中apply函数是非常特殊的一种函数,在Scala中的object中,可以声明apply函数,而使用“类名()”的方式,就是“类名.apply()”的一种缩写,通常使用这种方式来构造类的对象,而不是“new 类名()”的方式。例如:”Hello World”(6),因为在StringOps类中,有 def apply(n: int) :Char的函数定义,所以”Hello World”(6),实际上就是”Hello World”.apply(6)的缩写 ,例如 Array(1,2,3,4,5) 实际上是用 Array的object的appay函数来创建类的实例,也就是一个数组