scala笔记-基础语法(1)
声明变量
·声明val变量:可以声明val变量来存放表达式的计算结果。 eg:val result = 1 + 1,后续这些常量是可以继续使用的,eg: 2 * result ·但是常量声明后,是无法改变它的值的,eg:result = 1,会返回error: reassignment to val的错误信息。
·声明var变量:如果要声明值可以改变的引用,可以使用var变量。 eg:val myresult = 1,myresult = 2
但是在scala程序中,通常建议使用val,也就是常量,因此比如类似于spark的 大型复杂系统中,需要大量的网络传输数据,如果使用var,可能会担心值被错误的更改。
在Java的大型复杂系统的设计和开发中,也使用了类似的特性,我们通常会将传递给其他模块 / 组件 / 服务的对象,设计成不可变类(Immutable Class)。在里面也会使用java的常量定义,比如final,阻止变量的值被改变。从而提高系统的健壮性(robust,鲁棒性),和安全性。
·指定类型:无论声明val变量,还是声明var变量,都可以手动指定其类型,如果不指定的话,scala会自动根据值,进行类型的推断。eg:val name: String = null ·eg:val name: Any = “leo”
·声明多个变量:可以将多个变量放在一起进行声明。eg:val name1, name2:String = null ·eg:val num1, num2 = 100
数据类型与操作符
·基本数据类型:Byte、Char、Short、Int、Long、Float、Double、Boolean。
乍一看与Java的基本数据类型的包装类型相同,但是scala没有基本数据类型与包装类型的概念,统一都是类。scala自己会负责基本数据类型和引用类型的转换操作。
使用以上类型,直接就可以调用大量的函数,eg:1.toString(),1.to(10)。
类型的加强版类型:scala使用很多加强类给数据类型增加了上百种增强的功能或函数。
eg: String类通过StringOps类增强了大量的函数,“Hello”.intersect(" World")。
eg: Scala还提供了RichInt、RichDouble、RichChar等类型,RichInt就提供了to函数,1.to(10),此处Int先隐式转换为RichInt,然后再调用其to函数
·基本操作符:scala的算术操作符与java的算术操作符也没有什么区别,比如+、-、*、/、%等,以及&、|、^、>>、<<等。 ·但是,在scala中,这些操作符其实是数据类型的函数,比如1 + 1,可以写做1.+(1)
eg: 1.to(10),又可以写做1 to 10
·scala中没有提供++、–操作符,我们只能使用+和-,比如counter =1,counter++是错误的,必须写做counter += 1.
函数调用与apply()函数
函数调用方式:在scala中,函数调用也很简单。
eg: import scala.math._,sqrt(2),pow(2, 4),min(3, Pi)。
不同的一点是,如果调用函数时,不需要传递参数,则scala允许调用函数时省略括号的,eg: “Hello World”.distinct ·apply函数
·Scala中的apply函数是非常特殊的一种函数,在Scala的object中,可以声明apply函数。而使用“类名()”的形式,其实就是“类名.apply()”的一种缩写。通常使用这种方式来构造类的对象,而不是使用“new 类名()”的方式。
eg: “Hello World”(6),因为在StringOps类中有def apply(n: Int): Char的函数定义,所以"Hello World"(6),实际上是"Hello World".apply(6)的缩写。
eg: Array(1, 2, 3, 4),实际上是用Array object的apply()函数来创建Array类的实例,也就是一个数组。
scala的正则表达式支持
定义一个正则表达式 使用String类的r方法
val pattern1 = "[a-z]+".r
此时返回的类型是scala.until.matching.Regex类型
获取一个字符串中匹配正则表达式的部分,使用findAllIn
for (matchString <- pattern1.findAllIn(str))
println(matchString)
findFirstIn:获取第一个匹配正则的部分
pattern1.findFirstIn(str)
replaceAllIn:替换匹配正则部分
pattern1.replaceAllIn("str","str2")
replaceFirstIn:替换第一个匹配正则部分
pattern1.replaceFirstIn("str","str2")
提取器
提取器就是一个包含unapply方法的对象,与apply相反
apply:接收一堆参数构造出来的对象
unapply:接收一个字符串,解析出对象的属性值
class Person(val name:String,val age:Int)
object Person{
def unapply(str:String)={
val splitIndex =str.indexOf("")
if(splitIndex == -1) None
else Some((str.substring(0,splitIndex),str.substring(splitIndex +1)))
}
}
val Person(name,age) = "leo 25"
name
age
样例类提取器
类似于javaBean
case class Person(name:String,age:Int)
val p = Person("leo",25)
p match{
case Person(name,age)=> println(name +":" + age)
}
上一篇: 6月编程语言排行榜:JavaScript占有率创新高
下一篇: 获取url后面参数