Scala入門:Scala例子,以及如何與Java交互
本文源自Michel Schinz和Philipp Haller所寫的A Scala Tutorial for Java programmers,由Bearice成中文。下面先對Scala進行一個簡單的介紹,提供一個簡單的Scala例子,并描述一下Scala與Java交互的情況。
51CTO編輯推薦:Scala編程語言專題
1 簡介
本文僅在對Scala語言和其編譯器進行簡要介紹。本文的目的讀者是那些已經具有一定編程經驗,而想嘗試一下Scala語言的人們。要閱讀本文,你應當具有基礎的面向對象編程的概念,尤其是Java語言的。
2 第一個Scala例子
作為學習Scala的第一步,我們將首先寫一個標準的HelloWorld,這個雖然不是很有趣,但是它可以讓你對Scala有一個最直觀的認識而不需要太多關于這個語言的知識。我們的Hello world看起來像這樣:
object HelloWorld {
def main(args: Array[String]) {
println("Hello, world!")
}
}
程序的結構對Java程序員來說可能很令人懷念:它由一個main函數來接受命令行參數,也就是一個String數組。這個函數的唯一一行代碼把我們的問候語傳遞給了一個叫println的預定義函數。main函數不返回值(所以它是一個procedure method)。所以,也不需要聲明返回類型。
對于Java程序員比較陌生的是包含了main函數的object語句。這樣的語句定義了一個單例對象:一個有且僅有一個實例的類。object語句在定義了一個叫HelloWorld的類的同時還定義了一個叫HelloWorld的實例。這個實例在第一次使用的時候會進行實例化。
聰明的讀者可能會發現main函數并沒有使用static修飾符,這是由于靜態成員(方法或者變量)在Scala中并不存在。Scala從不定義靜態成員,而通過定義單例object取而代之。
2.1 編譯實例
我們使用Scala編譯器“scalac”來編譯Scala代碼。和大多數編譯器一樣,scalac 接受源文件名和一些選項作為參數,生成一個或者多個目標文件。scala編譯生成的產物就是標準的Java類文件。
假設我們吧上述代碼保存為文件HelloWorld.scala,我們使用下面的命令編譯它(大于號“>”表示命令提示符,你不必輸入它)
> scalac HelloWorld.scala
這將會在當前目錄生成一系列.class文件。其中的一個名為HelloWorld.class 的文件中定義了一個可以直接使用scala命令執行的類。下文中你可以看到這個例子。
2.2 運行實例
一旦完成編譯,Scala程序就可以使用scala命令執行了。scala的用法和java很相似,并且連選項也大致相同。上面的例子就可以使用下面的命令運行,這將會產生我們所期望的輸出。
> scala -classpath . HelloWorld
Hello, world!
3 Scala與Java交互
Scala的一個強項在于可以很簡單的于已有的Java代碼交互,所有java.lang中的類都已經被自動導入了,而其他的類需要顯式聲明導入。
來看看演示代碼吧。我們希望對日期進行格式化處理,比如說用法國的格式。
Java類庫定義了一系列很有用的類,比如Date和DateFormat。由于Scala于Java能夠進行很好的交互,我們不需要在Scala類庫中實現等效的代碼,而只需直接吧Java的相關類導入就可以了:
import java.util.{Date, Locale}
import java.text.DateFormat
import java.text.DateFormat._
object FrenchDate {
def main(args: Array[String]) {
val now = new Date
val df = getDateInstance(LONG, Locale.FRANCE)
println(df format now)
}
}
Scala的import語句看上去與Java的非常相似,但是它更加強大。你可以使用大括號來導入同一個包里的多個類,就像上面代碼中第一行所做的那樣。另一個不同點是當導入一個包中所有的類或者符號時,你應該使用下劃線(_)而不是星號(*)。這是由于星號在Scala中是一個有效的標識符(例如作為方法名稱)。這個例子我們稍后會遇到。
第三行的import語句導入了DataFormat類中的所有成員,這使得靜態方法getDateInstance和靜態變量LONG可以被直接引用。
在main函數中,我們首先建立了一個Java的Date實例。這個實例默認會包含當前時間。接下來我們一個使用剛才導入的靜態函數getDateInstance定義了日期格式。最后我們將使用DataFotmat格式化好的日期打印了出來。最后一行代碼顯示了Scala的一個有趣的語法:只有一個參數的函數可以使用下面這樣的表達式來表示:
df format now
其實就是下面的這個冗長的表達式的簡潔寫法
df.format(now)
這看起來是一個語法細節,但是它導致一個重要的后果,我們將在下一節進行說明。
另外,我們還應當注意到Scala中可以直接繼承或者實現Java中的接口和類。
看過了上面的Scala例子以及Scala與Java交互的方式,下文將介紹Scala的對象。
【相關閱讀】


















