首页 > 代码库 > scala初探(一)

scala初探(一)

Scala语言是在JVM上编程的优秀语言之一,其为并发,表达式和可扩展性而设计。这门语言及其程序库可以让你专注于问题而无需深陷于线程和同步等底层基础结构细节。Scala是一门混合了函数式和面向对象的语言。有以下特性:

1. Scala对函数式编程的支持可以写出非常简洁而有表现力的代码;

2. 对于多线程应用,Scala提供了基于actor的消息传递模型,消除了涉及并发的痛苦问题,利用该模型,可以很方便简单的写出多线程代码,而不用考虑线程之间的数据竞争和加锁释放锁等问题;

3. Scala和java一样是运行在JVM上的,可以与java很好的互操作。

       

Scala与java的运行机制类似,首先使用scalac将Scala源代码编译成JVM可以处理的字节码,然后由JVM解释执行。因此从运行上来看和java区别就在于源程序的语法和编译程序上,这也是JVM上语言众多的原因之一。

        了解了Scala的特点和运行机制后,下面开始学习Scala的语法。

学习每一门语言的第一个程序当然是“Hello,World!”。

<span style="font-family:KaiTi_GB2312;"><strong><span style="font-family:Microsoft YaHei;font-size:18px;">println("hello world")</span></strong></span>

如同Python一样简洁的语法,一行程序即可,不需要主函数和类的包裹,直接执行。

当然也可以这么写:

<span style="font-family:KaiTi_GB2312;"><strong><span style="font-family:Microsoft YaHei;font-size:18px;">def main(args: Array[String]) = {
	println("hello world")
}</span></strong></span>
<span style="font-family:KaiTi_GB2312;"><strong><span style="font-family:Microsoft YaHei;font-size:18px;">main(null)</span></strong></span>
1. 循环结构

<span style="font-family:KaiTi_GB2312;"><strong><span style="font-family:Microsoft YaHei;font-size:18px;">for(i <- 1 to 100){
	println(i)
}

(1 to 100).foreach(i => print(i + ","))</span></strong></span>

1 to 100表示从1到100,其函数原型是1.to(100),因为在Scala中可以将.()省略,所以可以很简洁的表示成1 to 100,这样表示更像是一般的英语表示。

<-表示将1到100赋值给i这个变量。注意,这里的i是val(不变变量),而不是var(可变变量),这里看似每次循环改变了i的值,实质上是每次新建一个val i,因此i是不可变的。

第二种循环方式使用了foreach,这对于数组等结构的遍历特别方便,其中 => 表示对(1 to 100)中每个元素i执行=>后面的语句。

2. 函数定义

<span style="font-family:KaiTi_GB2312;"><strong><span style="font-family:Microsoft YaHei;font-size:18px;">def getInfo(number : Int) :(Int,Int,Int) = {
	(123,234,345)
}</span></strong></span>
函数是函数式语言中一等公民。定义函数使用def关键字;:后面表示返回类型,这里表示返回一个全是整型的三元组;=表示类型推演(根据函数内容推测返回类型),在函数体中不用使用return关键字(Scala中应该尽量减少使用return,尽量使用类型推演)。

3. 类定义

<span style="font-family:KaiTi_GB2312;"><strong><span style="font-family:Microsoft YaHei;font-size:18px;">class Car(val year: Int){
	private var mileDriven: Int = 0

	def miles() = mileDriven

	def drive(distance: Int){
		mileDriven += Math.abs(distance)
	}
}

val car = new Car(2009)
println("The car made in " + car.year)
println("Miles drivens " + car.miles)
car.drive(100)
println("Miles drivens " + car.miles)</span></strong></span>


<span style="font-family:KaiTi_GB2312;"><strong><span style="font-family:Microsoft YaHei;font-size:18px;">class Person(val firstName: String,val lastName: String){
	// "_ "表示的是该类型的默认值
	private var position: String = _

	//@scala.reflect.BeanProperty
	var age: Int = _

	println("Creating " + toString())
	//this是副构造函数
	def this(firstName: String,lastName:String,positionHeld: String){
		this(firstName,lastName)

		position = positionHeld
	}
	//重写函数
	override def toString(): String = {
		firstName + " " + lastName + " holds " + position + " position "
	}
}

val john = new Person("John","Smith","Analyst")
println(john)
val bill = new Person("Bill","Walker")
println(bill)</span></strong></span>


类定义仍然使用class关键字定义,而构造函数则直接镶嵌在类头(val year: Int),可变成员则定义在类内部。在调用函数时,如果函数没有参数,可以省略括号。

4.  继承

<span style="font-family:KaiTi_GB2312;"><strong><span style="font-family:Microsoft YaHei;font-size:18px;">//继承
class Vehicle(val id: Int,val year: Int){
	override def toString(): String = "ID: " + id + " Year: " + year
}

class Car(override val id: Int,override val year: Int, val fuelLevel: Int) extends Vehicle(id,year){
	override def toString(): String = super.toString() + " Fuel Level: " + fuelLevel
}

val car = new Car(1,2009,100)
println(car)</span></strong></span>

子类继承父类时,父类的成员属性和成员方法必须使用override关键字区别。因为任何类都继承于Any类,而Any类中含有toString()。



scala初探(一)