Scala
是一門結(jié)合OO
, FP
特性的混血兒渗常,支持多種范式的程序設(shè)計(jì)語言。本文通過一個(gè)簡單的例子汗盘,開啟Scala
的破冰之旅皱碘。
需求:將一個(gè)字符串序列依次轉(zhuǎn)化為大寫
破冰
object Strings {
def upper(strs: String*): Seq[String] = {
strs.map((s: String) => s.toUpperCase())
}
}
單鍵對(duì)象
Scala
摒棄了static
的語義,使用object
隐孽,體現(xiàn)了Scala
純正的OO
血統(tǒng)癌椿。諸如靜態(tài)工廠方法,工具類等實(shí)現(xiàn)模式菱阵,是Scala
單鍵對(duì)象最佳的使用場景踢俄。
變長參數(shù)
strs: String*
表示變長的字符串列表,可以向Strings.upper
傳遞任意多的字符串晴及。事實(shí)上都办,strs: String*
的真正類型為scala.collection.mutable.WrappedArray
,所以strs: String*
擁有普通集合類的一般特征虑稼,例如調(diào)用map
方法琳钉。
泛型
Seq[String]
是Scala
的泛型表示,而非Seq<String>
蛛倦。Seq
表示一個(gè)有序的集合歌懒。事實(shí)上,strs.map
返回的類型實(shí)際為scala.collection.mutable.ArrayBuffer
胰蝠,但用戶無需感知這個(gè)事實(shí)歼培,這也體現(xiàn)了「按照接口編程」的良好設(shè)計(jì)原則震蒋。
一等函數(shù)
(s: String) => s.toUpperCase()
是一個(gè)函數(shù)字面值,或者將其看成一個(gè)匿名函數(shù)躲庄。事實(shí)上查剖,它真正的類型為:Function1[String, String]
,表示入?yún)?code>String類型噪窘,返回值為String
的一元函數(shù)笋庄,從而將FP
很優(yōu)雅地融入到OO
的世界之中。
表達(dá)式
Scala
一切都是面向表達(dá)式的倔监,包括函數(shù)或方法直砂;此外,函數(shù)返回值的=
語法浩习,也增強(qiáng)了Scala
類型推演的能力静暂,而且常常略去顯式的return
關(guān)鍵字(顯式的return
,相反削弱了函數(shù)返回值自動(dòng)推演的能力)谱秽。
特殊地洽蛀,當(dāng)函數(shù)只包含單條語句時(shí),常常略去大括號(hào)疟赊,使得函數(shù)更像表達(dá)式郊供,程序因此也變得極其優(yōu)雅,簡單近哟,漂亮驮审。
def upper(strs: String*): Seq[String] =
strs.map((s: String) => s.toUpperCase())
類型推演
事實(shí)上,編譯器可以很容易地推演出匿名函數(shù)的入?yún)㈩愋图矗瘮?shù)字面值可以變得更加簡單疯淫。
def upper(strs: String*): Seq[String] =
strs.map(s => s.toUpperCase())
省略括號(hào)
按照慣例,略去s.toUpperCase()
的括號(hào)鼠证,強(qiáng)調(diào)函數(shù)是無副作用的峡竣。
def upper(strs: String*): Seq[String] =
strs.map(s => s.toUpperCase)
占位符
因?yàn)楹瘮?shù)字面值s => s.toUpperCase
中的s
在函數(shù)體內(nèi)僅出現(xiàn)一次,可以使用「占位符」進(jìn)一步簡化程序量九。
def upper(strs: String*): Seq[String] =
strs.map(_.toUpperCase)
重載
第二個(gè)
upper
重載函數(shù)适掰,必須顯式地聲明返回值類型;不能指望根據(jù)第一個(gè)重載的upper
函數(shù)能夠自動(dòng)推演其返回值類型荠列。strs: _*
是將集合對(duì)象展開為變長參數(shù)的特殊語法类浪。
object Strings {
def upper(strs: String*): Seq[String] =
strs.map(_.toUpperCase)
def upper(strs: Array[String]): Seq[String] =
upper(strs: String*)
}