又一篇寫(xiě)給小師妹的Scala學(xué)習(xí)筆記·一

每天兩頁(yè),分享《Programming in Scala》的心得噪服。

這個(gè)系列之前其實(shí)寫(xiě)過(guò)。具體可以看:

寫(xiě)給小師妹的Scala學(xué)習(xí)筆記·開(kāi)篇
寫(xiě)給小師妹的Scala學(xué)習(xí)筆記·二

當(dāng)時(shí)是為了快速“學(xué)會(huì)”Scala霜医,選擇了疾風(fēng)式的搞法事镣,幾周就擼完一本書(shū)。

這次我們慢下來(lái)古劲,找一本Scala作者自己寫(xiě)的書(shū)斥赋,仔細(xì)品一品Scala的設(shè)計(jì)哲學(xué),并且以日記的形式記錄一下所思所想产艾。

以下是正文部分疤剑。

2022-01-02

今天讀的這一章的大標(biāo)題叫做“ A Scalable Language”。Scala這個(gè)名字闷堡,源于作者希望創(chuàng)造一種Scala-ble的語(yǔ)言隘膘。

接下來(lái),他簡(jiǎn)要的介紹了Scala的幾個(gè)特性:

首先杠览,它是一種運(yùn)行在JVM上的語(yǔ)言弯菊,因此和Java具有“無(wú)縫”的交操作性。借助于Java強(qiáng)大的生態(tài)倦零,可以少造無(wú)數(shù)輪子误续。當(dāng)然像Groovy、Clojure等等都有這樣的特性扫茅。

其次蹋嵌,Scala兼有面向?qū)ο蠛秃瘮?shù)式2種編程范式(這一點(diǎn)其實(shí)是相當(dāng)不常見(jiàn)的),而且是一門(mén)靜態(tài)類(lèi)型的語(yǔ)言(所謂動(dòng)態(tài)一時(shí)爽葫隙,重構(gòu)火葬場(chǎng)栽烂,靜態(tài)語(yǔ)言,可以讓編譯器替你干不少臟活累活)恋脚。函數(shù)式的一面使得它易于構(gòu)建小組件腺办,面向?qū)ο笫沟盟梢杂脕?lái)構(gòu)建大型程序。

接下來(lái)作者強(qiáng)調(diào)糟描,編寫(xiě)Scala代碼的過(guò)程是“fun”的怀喉。并通過(guò)一個(gè)Map的例子,作者展示了船响,Scala具備類(lèi)型推導(dǎo)能力和易用的API躬拢。

var captial = Map("US" -> "Washington", "France" -> "Paris")
captial += ("Japan" -> "Tokyo")
println(captial("France"))

比如躲履,不需要多余的分號(hào),不需要聲明Map<String, String>這樣的類(lèi)型聊闯,初始化時(shí)可以直接設(shè)置2個(gè)鍵值對(duì)進(jìn)去工猜,而不用單獨(dú)調(diào)用put方法。

對(duì)比一下原生Java的寫(xiě)法:

Map<String, String> captial = new HashMap<>();
captial.put("US", "Washington");
captial.put("France", "Paris");

captial.put("Japan", "Tokyo");
System.out.println(captial.get("France"));

2022-01-03

今天讀的這一節(jié)的小標(biāo)題是“A language that grows on you”菱蔬,翻譯過(guò)來(lái)應(yīng)該是“一門(mén)會(huì)讓你慢慢愛(ài)上的語(yǔ)言”篷帅。

接下來(lái)作者用兩個(gè)例子,印證了這句話(huà)拴泌。這兩個(gè)例子分別是魏身,可自定義的數(shù)據(jù)類(lèi)型(以BigInt為例)和可自定義的控制結(jié)構(gòu)(以Akka的API為例)。在一番code show之后弛针,作者都要表達(dá)一下“這些并不是語(yǔ)言?xún)?nèi)建(build-in)的特性叠骑,但是用起來(lái)和內(nèi)建的沒(méi)有區(qū)別”李皇。

過(guò)程中削茁,還引用了Eric Raymond《大教堂與集市》的說(shuō)法,表達(dá)了Scala的設(shè)計(jì)哲學(xué)更接近于集市掉房。

到這里茧跋,作者想表達(dá)的意思是比較明確的:Scala是一門(mén)內(nèi)核極其精煉的語(yǔ)言,但卻有著非常高的可拓展性卓囚。就好像集市一樣瘾杭,它并沒(méi)有(也不可能)事先規(guī)劃好所有的內(nèi)容,但卻擁有極強(qiáng)的演化能力哪亿。

2022-01-04

今天讀的這一小節(jié)的標(biāo)題是:“What makes Scala scalable?”粥烁。對(duì)于之前提到的面向?qū)ο蠹昂瘮?shù)式編程再次做了個(gè)補(bǔ)充,并且可以說(shuō)是干貨滿(mǎn)滿(mǎn)蝇棉。

首先作者講了讨阻,Scala是OO的。而OO的本質(zhì)是把數(shù)據(jù)和操作封裝在一個(gè)容器中篡殷,這個(gè)容器就叫做Object钝吮。這樣,操作變成了一種數(shù)據(jù)板辽,容器本身也作為數(shù)據(jù)可以被傳來(lái)傳去奇瘦。

同時(shí),作者舉了例子劲弦,說(shuō)有些語(yǔ)言不是那么“純”的OO耳标,比如在Java里面,原始類(lèi)型就不是對(duì)象(數(shù)組也不是)邑跪,同時(shí)次坡,Java還允許在class中定義靜態(tài)的字段和方法纲仍。而在Scala中,任何的值本質(zhì)上都是對(duì)象贸毕,甚至與1 + 2也是郑叠,它的底層是針對(duì)1這個(gè)Int調(diào)用了+這個(gè)方法,同時(shí)傳入了參數(shù)2明棍。

作者舉的第二個(gè)例子是關(guān)于trait乡革。它有點(diǎn)像Java中的接口,但是擁有自己的字段和方法實(shí)現(xiàn)摊腋。關(guān)于trait其實(shí)一直有一些困惑沸版,希望后面的章節(jié)可以解答。

接著作者又講到Scala是函數(shù)式的兴蒸。這一段堪稱(chēng)“教科書(shū)”式的介紹视粮。

作者介紹了,函數(shù)式編程的2個(gè)特點(diǎn)橙凳。函數(shù)是一等公民蕾殴、函數(shù)調(diào)用需要做到引用透明,也就是沒(méi)有副作用岛啸。

一等公民是指钓觉,函數(shù)可以在任意地方被定義(比如在一個(gè)函數(shù)里),還可以像數(shù)值一樣作為入?yún)⒒蛘叻祷兀ǜ唠A函數(shù))坚踩。

那什么叫有副作用的函數(shù)調(diào)用荡灾。包括:

打印日志、修改了函數(shù)的入?yún)⑺仓暮瘮?shù)參數(shù)外(全局變量批幌、bean、threadlocal)獲取數(shù)據(jù)嗓节、拋出異常等等荧缘。對(duì)應(yīng)的,一個(gè)沒(méi)有副作用的赦政,引用透明的函數(shù)胜宇,只有輸入/輸出,并且輸出可以被等價(jià)替換掉恢着。

比如1+sum(1, 1)中桐愉,sum函數(shù)如果可以直接用2替換,就說(shuō)明是引用透明的掰派。

2022-01-05

今天的這一小節(jié)从诲,大標(biāo)題是“Why Scala?”靡羡,作者從兼容性系洛、簡(jiǎn)潔程度俊性、高級(jí)抽象(?)和靜態(tài)類(lèi)型4個(gè)方面講了描扯,為什么要選擇Scala定页。

第一部分是兼容性,除了前面提到的互操作性之外绽诚,還強(qiáng)調(diào)了典徊,像底層的String、Int之類(lèi)的都是復(fù)用的Java原生的類(lèi)型恩够。同時(shí)卒落,Scala還通過(guò)一個(gè)叫“隱式轉(zhuǎn)換”的概念,在不修改這些類(lèi)源碼的情況下蜂桶,對(duì)這些類(lèi)做了增強(qiáng)儡毕。

第二部分是簡(jiǎn)潔性。這個(gè)不多說(shuō)了扑媚,差不多是同樣功能的Java的代碼量的1/4吧腰湾。后面又介紹了“trait”這個(gè)留到后面展開(kāi)。

2022-01-08

中間的記錄斷了兩天钦购,不過(guò)問(wèn)題不大檐盟。書(shū)還是在看的。

這一段押桃,作者提到Scala是“high-level”的,實(shí)際上导犹,作者想強(qiáng)調(diào)的依然是“函數(shù)式”編程范式帶來(lái)的好處唱凯。

(正本清源)

函數(shù)式編程和面向?qū)ο缶幊滩⒉粵_突,用Java照樣可以寫(xiě)出非常函數(shù)式的代碼谎痢。

真正不太兼容的其實(shí)是描述式的風(fēng)格和命令式的風(fēng)格磕昼。

比如給定一個(gè)Int列表,求各元素之和节猿。如果用命令式風(fēng)格來(lái)寫(xiě)票从,起手一個(gè)sum = 0,后接一個(gè)i = 0滨嘱,最后for循環(huán)收尾峰鄙。

如果用描述式風(fēng)格來(lái)寫(xiě),“一個(gè)列表的各個(gè)元素之和” 等于 “列表的第一個(gè)元素” 加上 “列表其余元素構(gòu)成的列表的各個(gè)元素之和”太雨。

假設(shè)取列表的第一個(gè)元素用head表示吟榴,取列表的剩余元素構(gòu)成的列表用tail表示。則偽代碼如下:

sum(alist) = {
if(alist != empty) return 0
else return head(alist) + sum(tail(alist))
}

可以看到囊扳,描述式風(fēng)格和遞歸是比較自然的一對(duì)組合兜看,無(wú)怪于FP系的語(yǔ)言都喜歡用遞歸。

遵循函數(shù)式風(fēng)格的另一個(gè)好處细移,是可以寫(xiě)出“引用透明”的函數(shù)熊锭。也就是說(shuō)葫哗,這個(gè)函數(shù)調(diào)用的結(jié)果,可以用該函數(shù)的返回值等價(jià)的替換掉球涛。

比如代碼里有一段是:a + sum(b, c)劣针,如果b和c分別等于2和3的話(huà)亿扁,那么和直接寫(xiě)a + 5是等價(jià)的〈幼#或許因?yàn)檫@個(gè)例子太簡(jiǎn)單了襟己,并且是數(shù)值計(jì)算,所以大部分人可以天然的寫(xiě)出這種引用透明的函數(shù)牍陌。

但擎浴,如果是一段業(yè)務(wù)代碼毒涧,你能保證不在函數(shù)里調(diào)用Spring的bean去讀寫(xiě)數(shù)據(jù)庫(kù)嗎?能保證不修改某個(gè)全局變量或者ThreadLocal嗎契讲?能保證不去調(diào)用某個(gè)入?yún)⒌膕et方法嗎?

引用透明的另一種說(shuō)法是“沒(méi)有副作用”唤冈,以上列的一些例子都是副作用的體現(xiàn)银伟。

沒(méi)有副作用的代碼你虹,易于測(cè)試和重構(gòu)彤避,也更少的引入bug。想想是不是經(jīng)常發(fā)現(xiàn)某個(gè)字段挟伙,在經(jīng)歷了一系列的函數(shù)調(diào)用之后,不知道什么時(shí)候就被設(shè)置了一個(gè)不太符合預(yù)期的值尖阔,然后引出一系列莫名其妙的問(wèn)題?

上面提到的最后一個(gè)例子介却,有一個(gè)專(zhuān)門(mén)的名字,叫aliasing problem桂肌,那么函數(shù)式的編程風(fēng)格永淌,是如何避免這樣的問(wèn)題呢?答案就是使用不可變的數(shù)據(jù)(immutable data)遂蛀。

通過(guò)把一個(gè)類(lèi)所有的字段都設(shè)置成final的,這個(gè)類(lèi)就是一個(gè)不可變的類(lèi)(如果有個(gè)字段是final的Map李滴,非要去修改這個(gè)Map,就屬于硬杠了)谆扎。

相應(yīng)的芹助,函數(shù)體里面也不再能set各種字段。一旦要改變些什么周瞎,要應(yīng)該通過(guò)返回一個(gè)新的類(lèi)的實(shí)例完成。

實(shí)際上對(duì)于大多數(shù)程序員來(lái)說(shuō)声诸,疑問(wèn)都是,不可變的數(shù)據(jù)退盯,能編程嗎?看看Java的String渊迁,看看Spark的RDD。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末毒租,一起剝皮案震驚了整個(gè)濱河市箱叁,隨后出現(xiàn)的幾起案子惕医,更是在濱河造成了極大的恐慌算色,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件峡钓,死亡現(xiàn)場(chǎng)離奇詭異若河,居然都是意外死亡能岩,警方通過(guò)查閱死者的電腦和手機(jī)萧福,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)统锤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人饲窿,你說(shuō)我怎么就攤上這事》埽” “怎么了鸦泳?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)做鹰。 經(jīng)常有香客問(wèn)我,道長(zhǎng)更振,這世上最難降的妖魔是什么饭尝? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮实撒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘知态。我一直安慰自己,他們只是感情好肴甸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布原在。 她就那樣靜靜地躺著,像睡著了一般庶柿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上甚负,一...
    開(kāi)封第一講書(shū)人閱讀 51,182評(píng)論 1 299
  • 那天审残,我揣著相機(jī)與錄音,去河邊找鬼搅轿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛既穆,可吹牛的內(nèi)容都是我干的雀鹃。 我是一名探鬼主播幻工,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼囊颅,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼傅瞻!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起俭正,我...
    開(kāi)封第一講書(shū)人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤焙畔,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后儿惫,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡留搔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年铛铁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饵逐。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡倍权,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出薄声,到底是詐尸還是另有隱情,我是刑警寧澤默辨,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布廓奕,位于F島的核電站抱婉,受9級(jí)特大地震影響桌粉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜患亿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一押逼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧挑格,春花似錦、人聲如沸雾消。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至泉哈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間丛晦,已是汗流浹背添忘。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留搁骑,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓煤率,卻偏偏與公主長(zhǎng)得像乏冀,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子辆沦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 緣起 前幾天偶然看到我的To Do里有一條內(nèi)容是關(guān)于學(xué)習(xí)Scala的肢扯。雖然記不起是為什么以及什么時(shí)候加進(jìn)去的,但是...
    elon_wen閱讀 395評(píng)論 0 0
  • 第二周 這一周的內(nèi)容主要圍繞著“函數(shù)”來(lái)進(jìn)行乍钻。本來(lái)想順著書(shū)的內(nèi)容往下講,不過(guò)那樣就沒(méi)有自己的東西了银择,所以累舷,就想到哪...
    elon_wen閱讀 140評(píng)論 0 1
  • 大數(shù)據(jù)開(kāi)發(fā)中常用 Scala 進(jìn)行功能開(kāi)發(fā),而且大數(shù)據(jù)處理和計(jì)算框架 Flink 和 Spark 都是基于 Sca...
    火影啟源閱讀 613評(píng)論 0 2
  • scala學(xué)習(xí)筆記 第2章 變量和數(shù)據(jù)類(lèi)型 基本數(shù)據(jù) scala的核心數(shù)據(jù)為四種 :字面量怀挠、值、變量绿淋、類(lèi)型 值使...
    485b1aca799e閱讀 2,121評(píng)論 0 1
  • Scala是一種函數(shù)式編程語(yǔ)言尝盼,它具有函數(shù)式編程范式的諸多特點(diǎn)。需要說(shuō)明的是盾沫,scala并不是一種純函數(shù)式編程語(yǔ)言...
    我是老薛閱讀 1,954評(píng)論 0 2