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聲明的是不可變的呀癣。
總結
Scala 的語法跟 Kotlin 頗有相似之處,我是先學習了 Kotlin 再來學 Scala 的弦赖,所以對于 Scala 的語法毫無違和感项栏。在這里,我整理了var蹬竖、val的區(qū)別沼沈,for循環(huán)的使用流酬,以及類的基礎知識。
下一篇列另,我還是會繼續(xù)整理 Scala 的基礎語法相關內(nèi)容芽腾。如果我有寫得不正確的地方,請一定要告訴我页衙。
先前的文章:
Scala學習筆記(一)