https://www.scala-lang.org/ 官網
Linux 第一個Scala的案例:wordcount
代碼如下:
通過這段代碼我們需要了解:
1)Scala語言的簡潔性
2)函數式編程
3)spark是比MapReduce要快的。
Scala:object-oriented meets functional 面向對象遇到函數式編程
特點:優雅、速度快、能融合到Hadoop生態圈
第一步:在Windows系統下配置Scala環境
? ? ? ?下載Scala:現在市場上流行的是2.11版本,所以下載2.11版本
? ? ? ?本地版本:.msi,安裝之后在命令端直接可以使用了,不需要配置環境變量
? ? ? 然后就可以在Windows下運行Scala代碼了:
? ? ? ? ? 寫一個.scala文件:
? ? ? ? ? ? ? ? ? object Hello extends App{
? ? ? ? ? ? ? ? ? ? ? ?def? square(args:Array[String]) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? println("Hello, World!")
? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ?在cmd命令窗口進入該文件所在目錄,編譯:Scalac Hello.scala,運行:Scala Hello.class
第二步:安裝IDEA工具
? ? ? ?注意選擇磁盤上已經有的scala插件
? ? ? ?注意要選擇sdk目錄
? ? ? 注意最后要重啟
第三步:編寫代碼并運行
? ? ? ? ? 第一種:直接在IDEA窗口端執行代碼
? ? ? ? ? 第二種:手動打jar包->在Windows的命令窗口:首先進入該jar包所在目錄,然后執行命令:java -jar 1705scala.jar
? ? ? ? ? 小提示:在hdfs上也可以使用java -jar運行。
第四步:在Windows的Scala環境下聲明變量
? ? ? ? ? 使用Windows下的Scala環境來定義變量:
? ? ? ? ? 定義變量的修飾符val 和var
? ? ? ? ? 兩者的區別:var修飾的變量可以修改值;val修飾的變量是final類型的,不可以改變變量的值。
? ? ? ? ? ?在Scala中鼓勵使用val,即不讓改變變量的值。
? ? ? ? ? ?可以這樣思考:var是variable--變量,val是value--定義值
基本數據類型:
? ? ? ?首先有7中基本數據類型:Byte,Short,char,Int,Long,Float,Double,Boolean
? ? ? ?學習Scala常用類型的網站:Scala菜鳥驛站
條件表達式:在Scala中條件表達式是有返回值的,默認返回res0
? ? ? ? ?如果條件表達式的返回值類型不一樣,會返回Any類型的變量
? ? ? ? 如果不寫else默認會在后面補一個[else()]最終推斷出來的類型是AnyVal
? ? ? ? ()表示Unit類型,相當于java中的void類型。
塊表達式:最后一個表達式的值就是整個塊表達式的返回值。要理解這個概念,首先要理解一個塊的起始和結束標志,就是一對花括號包含的所有代碼就是一個塊表達式。
直接在窗口中寫批量代碼,使用下面這種方式:
? ? ? ? ? ? ? ?scala> :paste
? ? ? ? ? ? ? // Entering paste mode (ctrl-D to finish)
? 寫完代碼之后按Ctrl+D退出這種模式。
循環:while循環和for循環
? ? ?while循環:與java中while循環基本無異,但不支持++和--,注意如果要+和-變量要用var修飾
? ? for循環:定義數組 val x=Array(“a”,“b”,"c"),遍歷數組
? ? ? ? ? ? ? 第一種方式 for(i <- x){println(x)}?
? ? ? ? ? ? ? 第二種方式:for(i <- 1 to 10) {println(x)}
? ? ? ? ? ? ? 第三種方式:for(i <- 1 to x.length-1) {println(x(i))}
? ? ? ? ? ? ? 第三種方式:for(j <- 0 until x.length){println(x(i))}
? ? ? ? ? ? ? 小提示:在Scala中運算符==方法
? ? ?用一個集合(默認是Vector類型) 接收for循環所有的返回值,關鍵字:yield
? ? ?位操作符:& | ^ >> <<
調用方法和函數:
方法的聲明:方法與執行塊之間有=表示有返回值,不寫表示沒有返回值
? ? ? ? ? ? ? ? ? ? ? ? 兩個同名的方法會覆蓋
方法的調用:方法名 (實參),如果有返回值用一個變量接收返回值
這整個過程類似于java中的裝飾模式以及函數式編程。
裝飾模式是指在原有類的基礎上,對其中的某些方法進行增強的一種模式,這種模式在java IO中體現的最為明顯,字節流到緩存流的封裝。
實踐:對List集合增強map方法,并且該方法可以實現函數式編程。