Scala學習筆記(二)

Scala是什么营袜,能做什么路捧?

Scala是一門多范式的編程語言关霸,一種類似java的編程語言 ,設計初衷是實現(xiàn)可伸縮的語言杰扫、并集成面向對象編程和函數(shù)式編程的各種特性谒拴。

目前,Scala 在國外比較火涉波,Twitter 已經(jīng)將自己全部的代碼從 Ruby 轉到了Scala英上。而且還有 Spark、Kafka啤覆、akka 這樣的開源項目及 Twitter苍日、Linkedin 等公司大力支持,所以本人很看好 Scala 這門語言窗声。

Scala的基礎語法

我整理了自己學習過程中感到有必要記錄的東西相恃,以防忘記

1. val 與 var

Scala 有兩種定義變量的方式:val和var。

當val定義好變量之后笨觅,無法更改變量的值拦耐。類似于使用了Java的final來修飾變量。

scala> val param = "tony"
param: String = tony

scala> param = "monica"
<console>:12: error: reassignment to val
       param = "monica"
             ^

var定義的變量见剩,可以多次修改變量的值

scala> var param = "tony"
param: String = tony

scala> param = "monica"
param: String = monica

scala> println (param)
monica

有一個建議杀糯,Scala 程序員崇尚使用val,不可變對象和沒有副作用的方法苍苞。

2. 關于for循環(huán)

2.1 to關鍵字

跟Java不同固翰,Scala 的for循環(huán)變得很簡潔,直接使用to關鍵詞就可以了

scala> for (i<- 1 to 10) {
     |  println ("i is " + i)
     | }
i is 1
i is 2
i is 3
i is 4
i is 5
i is 6
i is 7
i is 8
i is 9
i is 10

2.2 until關鍵詞

也可以使用until關鍵詞

scala> for (i<- 1 until 10) {
     |  println("i is " + i)
     | }
i is 1
i is 2
i is 3
i is 4
i is 5
i is 6
i is 7
i is 8
i is 9

可以看出羹呵,until和to的不同之處在于不包括最后一個元素骂际。

2.3 遍歷集合

讀取根目錄下所有文件

scala> val files = (new java.io.File(".")).listFiles()

scala> for (file <- files) {
     |  println(file)
     | }
./.android
./.bash_history
./.bash_sessions
./.bashrc
./.CFUserTextEncoding
./.dir_colors
./.DS_Store
./.fonts
./.gdbinit
./.gimp
./.gitconfig
./.gitignore
./.gitignore_global
./.gradle

...

2.4 for循環(huán)和if條件語句一起使用

打印1到10,并且過濾出大于5的數(shù)字

scala>  for (i<- 1 to 10 if i>5) {
     |    println(i)
     | }
6
7
8
9
10

上面的代碼冈欢,對于Java版本需要這樣寫

for (int i=1;i++;i<=10) {
     if (i>5) {
           System.out.println(i)
     }
}

所以歉铝,在 Scala 的for循環(huán)語句中可以使用if語句來做for循環(huán)的條件過濾。
而且凑耻,for循環(huán)中還支持多個if條件太示,多個if之間需要用“;”來分割柠贤。

3. yield的用法

yield 會構造并返回與給定集合相同類型的集合。yield需要配合for循環(huán)來使用先匪。
先看yield的用法

for {子句} yield {變量或表達式}

再舉一些例子

scala>  for (i<- 1 to 10) yield i
res2: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

scala>  for (i<- 1 to 10) yield i*2
res3: scala.collection.immutable.IndexedSeq[Int] = Vector(2, 4, 6, 8, 10, 12, 14, 16, 18, 20)

scala> val array = Array(1, 2, 3, 4, 5,6,7,8,9,10)
array: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

scala> for (e<-array) yield e
res4: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

scala> for (e <- array if e > 5) yield e
res5: Array[Int] = Array(6, 7, 8, 9, 10)

當for循環(huán)結束后, 會返回所有 yield 的值組成的集合种吸。

再舉一個例子,在/Users/tony/文件夾下存放了一個test文本文件呀非。打印出該文本文件中包含Scala的整行內(nèi)容坚俗。

/**
  * Created by tony on 2017/2/2.
  */
object YieldDemo {

  private val files = (new java.io.File("/Users/tony/")).listFiles

  private def fileLines(file: java.io.File) =
    scala.io.Source.fromFile(file).getLines.toList

  def main(args: Array[String]): Unit = {
    val lineLengths =
      for {
        file <- files
        if file.getName.endsWith("test")

        line <- fileLines(file)
        trimmedLine = line.trim
        if trimmedLine.matches(".*Scala.*")
      } yield line

    lineLengths.foreach(println)
  }
}

4. class 與 object的區(qū)別

Scala中沒有靜態(tài)修飾符static,在object下的成員全部都是靜態(tài)的岸裙,如果在類中聲明了與該類相同的名字的object則該object是該類的“伴生對象”猖败,可以理解把類中的static集中放到了object對象中,伴生對象和類文件必須是同一個源文件降允,可以用伴生對象做一些初始化的操作恩闻。這一點上 Scala 和 Kotlin 有些類似。

而且object不能提供構造器參數(shù)剧董,也就是說object必須是無參的幢尚。

class的內(nèi)容實在太大了,未來會單獨寫一篇筆記翅楼。

5. 類中getter/setter 方法

在Java中尉剩,通常將字段聲明為私有的,然后添加公有的getter和setter方法來提供訪問字段的接口毅臊。

然而理茎,Scala 對每個字段都提供了getter和setter方法。
先看一個例子

/**
  * Created by tony on 2017/2/2.
  */
class User {

  var name:String = ""
}

object TestSetterAndGetter {

  def main(args:Array[String]): Unit = {

    val user = new User()
    println ("user.name="+user.name) // 調(diào)用方法user.name()

    user.name = "tony" // 調(diào)用方法user.name_=("tony")
    println ("user.name="+user.name)
  }
}

在上述例子中管嬉,User對象的getter和setter分別叫做name和name_=皂林。

將這個簡單的User類編譯后,使用javap查看生成的字節(jié)碼蚯撩,可以證實這一點础倍。

 javap -private User.class

生成如下的Java代碼

Compiled from "TestSetterAndGetter.scala"
public class com.safframework.test.User {
  private java.lang.String name;
  public java.lang.String name();
  public void name_$eq(java.lang.String); // =號被翻譯成了$eq
  public com.safframework.test.User();
}

將上述例子中將User對象name的var改成val會變成什么呢?編譯器會提示出錯求厕。使用val聲明的字段著隆,是只有getter,因為val聲明的是不可變的呀癣。


val聲明的字段無法實現(xiàn)setter.png

總結

Scala 的語法跟 Kotlin 頗有相似之處,我是先學習了 Kotlin 再來學 Scala 的弦赖,所以對于 Scala 的語法毫無違和感项栏。在這里,我整理了var蹬竖、val的區(qū)別沼沈,for循環(huán)的使用流酬,以及類的基礎知識。

下一篇列另,我還是會繼續(xù)整理 Scala 的基礎語法相關內(nèi)容芽腾。如果我有寫得不正確的地方,請一定要告訴我页衙。

先前的文章:
Scala學習筆記(一)

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末摊滔,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子店乐,更是在濱河造成了極大的恐慌艰躺,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件眨八,死亡現(xiàn)場離奇詭異腺兴,居然都是意外死亡,警方通過查閱死者的電腦和手機廉侧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門页响,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人段誊,你說我怎么就攤上這事闰蚕。” “怎么了枕扫?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵陪腌,是天一觀的道長。 經(jīng)常有香客問我烟瞧,道長诗鸭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任参滴,我火速辦了婚禮强岸,結果婚禮上,老公的妹妹穿的比我還像新娘砾赔。我一直安慰自己蝌箍,他們只是感情好,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布暴心。 她就那樣靜靜地躺著妓盲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪专普。 梳的紋絲不亂的頭發(fā)上悯衬,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天,我揣著相機與錄音檀夹,去河邊找鬼筋粗。 笑死策橘,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的娜亿。 我是一名探鬼主播丽已,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼买决!你這毒婦竟也來了沛婴?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤策州,失蹤者是張志新(化名)和其女友劉穎凹蜂,沒想到半個月后鹉勒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寂祥,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡贷掖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了孽糖。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片枯冈。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖办悟,靈堂內(nèi)的尸體忽然破棺而出尘奏,到底是詐尸還是另有隱情,我是刑警寧澤病蛉,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布炫加,位于F島的核電站,受9級特大地震影響铺然,放射性物質發(fā)生泄漏俗孝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一魄健、第九天 我趴在偏房一處隱蔽的房頂上張望赋铝。 院中可真熱鬧,春花似錦沽瘦、人聲如沸革骨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽良哲。三九已至,卻和暖如春助隧,著一層夾襖步出監(jiān)牢的瞬間臂外,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工喇颁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留漏健,地道東北人。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓橘霎,卻偏偏與公主長得像蔫浆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子姐叁,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

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

  • scala文檔 包含內(nèi)容 1基礎 2控制結構和函數(shù) 3數(shù)組相關操作 4映射和元組 5類 6對象 7.包和引入(x)...
    zlcook閱讀 1,005評論 0 3
  • 22.13.main方法 Scala的main方法(類似java的static方法)必須定義在一個object內(nèi):...
    時待吾閱讀 766評論 0 0
  • scala學習筆記 第2章 變量和數(shù)據(jù)類型 基本數(shù)據(jù) scala的核心數(shù)據(jù)為四種 :字面量瓦盛、值、變量外潜、類型 值使...
    485b1aca799e閱讀 2,130評論 0 1
  • Scala學習筆記: 1.1 scala的基礎語法 聲明與定義(賦值):聲明變量時可以指定類型原环,不指定也可以自動識...
    哎喲喂嘍閱讀 565評論 0 2
  • 前言 人生苦多,快來 Kotlin 处窥,快速學習Kotlin嘱吗! 什么是Kotlin? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,217評論 9 118