您的位置:首頁>正文

《scala程式設計實戰》讀書筆記——前言和第一章前2小節

一、 首先談談前言

這本書是O’Reilly書籍,同時也是本很厚的書籍,至於多厚,京東一看便知,博主不多說,打開第一眼, 基本上所有的書籍都是些前言和感謝信之類的東西(技術書籍的通病),但是我沒有直接進入正文急著去看書籍的內容, 正因為前言吸引了我(我的習慣一般是前言如果寫得不錯才會看下去, 不然直接跳正文)。 至於前言吸引我的地方, 是因為不僅大致講了書本的內容概覽, 還通過實例說明了scala的優劣性, 因為scala基於java的JVM, 所以有很多相似之處, 其中還說明到scala相較於java來說, 就是在某一些地方scala可以處理得更容易,

讓程式師從編碼當中解脫出來。

二、 第一章---字串

1、 從引言開始說起

//scala末尾一般是不加分號的,這點和python類似 println("Hello,world".getClass.getName)

結果:

不言而喻,scala確實很多地方是基於java實現的

然後引言大致說了一點函數式程式設計(書籍應該是java8沒出之前出版的, 因為書籍當中有提到java不支援函數式, 這點需要說明)

val result = "hello world".filter(_!='l') println(result)

懂一點函數式的應該都知道返回結果是: heo word, 因為filter在很多支援函數式程式設計語言當中都有用到,python, java8都可以實現此結果。 但是scala的實現卻不是java類, 而是擴展出來的StringOps,其次列出了StringOps的層級結構和超類。

最後說一個例子:

println("scala".drop(2).take(2).capitalize)

說說我的感受吧,看到這段代碼的時候其實並不知道是幹嘛的,然後因為此需求我就去把src添加上,然後利用ctrl+左鍵的方式查看源碼。

源碼分別為:

override /*TraversableLike*/ def drop(n: Int): Repr = slice(n, length) override /*TraversableLike*/ def take(n: Int): Repr = slice(0, n)/** Returns this string with first character converted to upper case. * If the first character of the string is capitalized, it is returned unchanged. * This method does not convert characters outside the Basic Multilingual Plane (BMP). */ def capitalize: String = if (toString == null) null else if (toString.length == 0) "" else if (toString.charAt(0).isUpper) toString else { val chars = toString.toCharArray chars(0) = chars(0).toUpper new String(chars) }

懂一點語言的都應該知道slice代表的是啥,這時我才恍然大悟,這並不是什麼很高深的東西,其實就是2個截取字串的方法,然後看了最後一個方法的注釋就知道首字母大寫,最後得出結果Al,當然書籍當中花了不少篇幅闡述了這些用法,但是如果想把一本書籍看得比較快一點, 不能一心的去咬文嚼字, 得靠自己的經驗學習新的東西, 這是博主的感受。

2、 測試字串相等

我開始看到例子的時候還是有一點驚訝的, 例子如下

val s1 = "Hello" val s2 = "Hello" println(s1 == s2) val s3 = "hello" println(s1.toUpperCase == s3.toUpperCase) //null不能調用方法 val s4 = null val s5 = null println(s4 == s5) // println(s4.toUpperCase == s5.toUpperCase)

當時我的感受是既然scala基於java, 為什麼不是equals方法判斷字串相等, 然後我一一的運行了一遍, 判斷結果和預想當中的是一樣的, 至於如果賦值為null, 是不能調用方法的, 會報java程式師經常看見的一個異常,

空指標, 不贅述。

最開始想到的是這是不是scala算是指令碼語言, 是不是和大部分指令碼語言實現機制一樣, 比如最常見的js, 最後看到小結之時才明白並不是如此, 而是scala會先去判斷null, 然後才會調用java的equals方法。

小結如下:

3、 創建多個字串

說明:為什麼這個例子我需要截圖, 原因後續說明

接下來看幾段代碼:

val foo ="""This is a muitiline String""" val foo1 = """This is | a muitiline | String""".stripMargin

至於變數foo1是怎麼來的呢, 書籍當中因為是命令列的方式, 就講到需要用到stripMargin方法以及默認”|”的使用,但實際上ide沒有這麼複雜,直接在對應字元敲回車就是,比如你要從is隔斷,就在is處回車就好,就會自動生成相應代碼,但是如果不加”|”以及stripMargin會怎樣呢,看下執行結果:

就會不左對齊,一眼就明白.

然後說說自訂:

val foo2 = """This is # a muitiline # String""".stripMargin('#')

很明顯符號是可以自訂的,不光可以使用”|”, 還可以在方法當中自訂為”#”,附stripMargin api(idea快速鍵:ctrl+q)

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示