Scala 的發(fā)展歷史
java 大概是在 92 年的時(shí)候出生的
scala 在 2003 年出生
2003 - 2013 年的時(shí)候,一直無(wú)人問(wèn)津.
2013 年的時(shí)候,開(kāi)始變火 ,spark 框架誕生了,這個(gè)帶火了scala,因?yàn)檫@個(gè)框架的底層就是使用scala開(kāi)發(fā)的
spark 可以使用 java 語(yǔ)言開(kāi)發(fā),也可以使用 Scala 語(yǔ)言開(kāi)發(fā)等等
看完本文后的能力:
能力1: 熟練使用 Scala 開(kāi)發(fā) spark 程序.

能力2 : 使用 scala 開(kāi)發(fā)一個(gè)簡(jiǎn)易的通信框架
能力2 : 使用 scala 開(kāi)發(fā)一個(gè)簡(jiǎn)易的通信框架

能力3 : 閱讀 spark 的源碼
能力3 : 閱讀 spark 的源碼

1. scala 的基本介紹
為什么要學(xué) Scala
1.優(yōu)雅: 這是框架設(shè)計(jì)師第一個(gè)要考慮的問(wèn)題,框架的用戶是應(yīng)用開(kāi)發(fā)程序員,APO 是否優(yōu)雅灰直接影響到用戶的體驗(yàn)
2.速度快: Scala 語(yǔ)言表達(dá)能力強(qiáng),一行代碼抵得上 Java 多行,開(kāi)發(fā)速度快,Scala 是靜態(tài)編譯的,所以和 JRuby , Groovy 比起來(lái)速度會(huì)快很多.
3.能融合到 Hadoop 生態(tài)圈: Hadoop 現(xiàn)在是一個(gè)大數(shù)據(jù)的事實(shí)標(biāo)準(zhǔn), Spark 并不是要取代 Hadoop ,而是要完善 Hadoop 生態(tài)圈, JVM 語(yǔ)言大部分可能會(huì)想到 Java ,但 Java 做出來(lái)的 API 太丑 ,或者想實(shí)現(xiàn)一個(gè)優(yōu)雅的 API 太費(fèi)勁了.
使用最多的版本是 2.11.
還有一個(gè)是2.10.x 版本也是比較多人用的,但是呢這個(gè)和上面那個(gè)不兼容的
scala 在數(shù)據(jù)處理上面,真的是非常的簡(jiǎn)潔,
2.scala 開(kāi)發(fā)環(huán)境的安裝
Windows 版本,建議去官網(wǎng)直接下載 zip 的安裝包,直接解壓后,.一定要注意的是,解壓到一個(gè)沒(méi)有中文沒(méi)有空格的路徑下面去.然后配置 SCALA_HOME 的環(huán)境變量就好了.這個(gè)本來(lái)沒(méi)有的要新建.
關(guān)于:用戶變量和系統(tǒng)變量,這兩個(gè)都可以,只不過(guò)是其權(quán)限 不同罷了,有些公司會(huì)把用戶變量或者系統(tǒng)變量的修改權(quán)限給你禁掉.
右擊我的電腦,單擊"屬性",進(jìn)入如圖所示頁(yè)面。下面開(kāi)始配置環(huán)境變量,右擊【我的電腦】--【屬性】--【高級(jí)系統(tǒng)設(shè)置】--【環(huán)境變量】
2.1.HOME 的后面接上解壓后的文件夾.
SCALA_HOME=D:\develop\scala-2.11.8
添加詞條SCALA_HOME

2.2.配置Path : 就是剛剛添加的環(huán)境變量的名稱的前面和后面都添加 % 號(hào),然后在后面添加 \bin
%SCALA_HOME%\bin
配置環(huán)path

3. 到這里就配置完成了我們的win 的 scala ,在我們的黑窗口CMD中敲擊命令 : scala 去檢驗(yàn)是否安裝成功.

3. Scala 開(kāi)發(fā)工具安裝
目前的 Scala 的開(kāi)發(fā)工具主要有兩種: Eclipse 和 IDEA ,.這兩個(gè)開(kāi)發(fā)工具都有相應(yīng)的 Scala 插件, 如果使用 Eclipse ,直接到 Scala 官網(wǎng)進(jìn)行下載對(duì)應(yīng)的版本就很可以了.
http://scala-ide.org/download/sdk.html
由于IDEA 的 Scala 插件更加的優(yōu)秀,大多數(shù)的 Scala 程序員都使用 IDEA 進(jìn)行開(kāi)發(fā)的,我們可以通過(guò)IDEA 進(jìn)行在線安裝,也可以到 IDEA 的插件網(wǎng)進(jìn)行下載對(duì)應(yīng)的版本插件進(jìn)行離線安裝,
http://www.jetbrains.com/idea/download/

我們進(jìn)入了 Plugins 之后,可以使用在線安裝,下面展示的是IDEA 2017(這個(gè)版本目前最多人用)也可以使用離線安裝,標(biāo)紅的位置就是使用我們本地安裝,這個(gè)安裝包就是我們剛剛?cè)ゾW(wǎng)站進(jìn)行下載的包.當(dāng)然也可以使用中間和左邊的在線安裝,更加的方便.


我們這里推薦使用離線進(jìn)行安裝,因?yàn)樵诰€國(guó)外的原因網(wǎng)速多少挺慢甚至沒(méi)有的.
到這里我們就已經(jīng)在我們的工具中安裝好了 Scala 開(kāi)發(fā)工具了, 然后重啟我們 IDEA

4. Scala 的 REPL(ReadEvalPrint Loop/ 交互式解釋器(其實(shí)按照單個(gè)的單詞進(jìn)行翻譯更好一些)
R (Read /閱讀), E(Evaluate / 評(píng)估) , P(Print / 打印輸出) , L(Loop / 循環(huán))
交互式解析器會(huì)讀取輸入內(nèi)容,并對(duì)它進(jìn)行求職,再返回結(jié)果,并重復(fù)此過(guò)程.(即所見(jiàn)即所得的編程)
說(shuō)人話就是: Scala提供了Scala REPL,在我不確定一個(gè)算子的功能時(shí),我可以很快打開(kāi)REPL進(jìn)行驗(yàn)證,并直觀得到答案。
REPL 的特性:
變量會(huì)在會(huì)話周期內(nèi)一直可用
多行代碼和單行代碼一起編譯
支持鏈接外部的數(shù)據(jù)庫(kù)和代碼
REPL 歷史命令會(huì)跨會(huì)話存儲(chǔ)
我們直接在黑窗口CMD 輸入 scala 就可以啟動(dòng) Scala 并且進(jìn)入到 REPL 中了

:help 查看我們可以使用到的常用命令,因?yàn)槊詈竺娑紟Я私忉尵筒灰灰唤忉屃?簡(jiǎn)單的英文自己不懂得可以翻譯哈!


REPL 自動(dòng)分配變量名: 如果我們?cè)?REPL 當(dāng)中沒(méi)有定義變量名,那么我們的變量名系統(tǒng)會(huì)自動(dòng)給定
注意: Scala 當(dāng)中的變量類型可以不用指定,系統(tǒng)會(huì)自動(dòng)推斷,為了減少可變性引起的 bug, Scala 當(dāng)中推薦盡量使用不可變類型來(lái)聲明變量. Var 和 Val 申明變量的時(shí)候,變量都必須初始化.
在 Scala 中我們的輸出打印只需要 ,相比java 的而言是簡(jiǎn)短很多很多的.
println()

以上就是我們簡(jiǎn)單的 REPL 的 案例:就是所見(jiàn)即所得,這里可能還是很難理解,因?yàn)檎N覀兪遣粫?huì)再這個(gè)小黑窗口進(jìn)行開(kāi)發(fā)的,所以稍后我們將進(jìn)入到 開(kāi)發(fā)工具中去進(jìn)一步的探索
4. 創(chuàng)建 支持 scala 的 maven工程代碼開(kāi)發(fā)
File ==> New ==> Project






在這三個(gè)之中,首先我們的Scala 的里面是可以直接寫(xiě)Java 代碼的,它是可以直接編譯并且運(yùn)行的.
Class 就是普通的java 對(duì)象.
在我們的java的類中可以寫(xiě)靜態(tài)的和非靜態(tài)的對(duì)象(變量/方法),他們的區(qū)別就是被 Static 靜態(tài)修飾的,我們可以直接進(jìn)行調(diào)用,不在需要先 new 一個(gè)類對(duì)象來(lái)進(jìn)行調(diào)用.那么這樣就是有時(shí)候,需要new ,有時(shí)候不用new ,靜態(tài)和非靜態(tài)的都混在了一起.

為了更好的進(jìn)行分離我們的 Scala 把靜態(tài)的給獨(dú)立出來(lái)形成了 Object 對(duì)象了,我們的 Object 就是我們的java 中被 static 靜態(tài)修飾的對(duì)象,也就是新建一個(gè)Object 之后,可以直接進(jìn)行調(diào)用的.我們一般也是新建Object 對(duì)象.
注意:我們是要先把 scala 中的 scala maven jar 包依賴寫(xiě)好了,才可以在我們maven 的 new 的時(shí)候, 才有 Create New Scala Class .如果不導(dǎo)入依賴,那么就沒(méi)有這個(gè)選項(xiàng)的,它只有新建 Java 對(duì)象.
day01子模塊中的pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>Scala</artifactId>
<groupId>asjdfas</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>asjdfas</groupId>
<artifactId>Scala</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module></module>
</modules>
<dependencies>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>2.11.8</version>
<!-- 如果想要用java -jar 來(lái)運(yùn)行我們打包之后的jar包,則下面這個(gè)配置必須注釋掉 -->
<!-- <scope>provided</scope>-->
</dependency>
</dependencies>
<build>
<plugins>
<!-- 限制jdk版本插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- 編譯scala需要用到的插件 -->
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>3.2.2</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- 項(xiàng)目打包用到的插件 -->
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>cn.itcast.scala.demo1.ScalaFirst</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
4.1

通常我們寫(xiě)完的代碼都是部署到服務(wù)器上面進(jìn)行運(yùn)行的,我們要打包,上傳到服務(wù)器然后運(yùn)行的.將我們的代碼打包,之后,進(jìn)行運(yùn)行 雙擊 package 之后,就會(huì)出現(xiàn)我們打好的 jar 包,然后有依賴的那個(gè)包就可以用了.
運(yùn)行我們的代碼一共可以有四個(gè)命令,兩種是打包的時(shí)候選擇了我們的 main 程序類的,兩 種是我們打包時(shí)候沒(méi)有選擇 main 程序類的 其中第一種和第三種,都是選定了我們的 main 程序類 第二種和第四種都是沒(méi)有選定我們的 main 程序類 四種運(yùn)行方式都可以用于運(yùn)行我們的 jar 包
第一種運(yùn)行方式:我們打包的時(shí)候指定了對(duì)應(yīng)的 main 方法所在的程序類
scala scaladay01-1.0-SNAPSHOT-jar-with-dependencies.jar
第二種運(yùn)行方式:不管打包的時(shí)候有沒(méi)有指定 main 方法所在的程序類,都可以運(yùn)行
scala -cp scaladay01-1.0-SNAPSHOT-jar-with-dependencies.jar cn.coyi.scala.demo1.ScalaFirst
第三種方式:我們打包的時(shí)候指定了對(duì)應(yīng)的 main 方法所在的程序類
java -jar scaladay01-1.0-SNAPSHOT-jar-with-dependencies.jar
第四種方式:不管打包的時(shí)候有沒(méi)有指定 main 方法所在的程序類,都可以運(yùn)行
java -cp scaladay01-1.0-SNAPSHOT-jar-with-dependencies.jar cn.coyi.scala.demo1.ScalaFirst

5. Scala 基礎(chǔ)入門(mén)

5.1 聲明變量的基本語(yǔ)法
1

2

3

4
image.png

5

6

7
