版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
教材簡介《Spark編程基礎(chǔ)(Scala版,第2版)》林子雨,賴永炫,陶繼平
編著,人民郵電出版社
ISBN:978-7-115-59501-0
教材官網(wǎng):/post/spark2/本書以Scala作為開發(fā)Spark應(yīng)用程序的編程語言,系統(tǒng)介紹了Spark編程的基礎(chǔ)知識。全書共9章,內(nèi)容包括:大數(shù)據(jù)技術(shù)概述Scala語言基礎(chǔ)Spark的設(shè)計與運行原理Spark環(huán)境搭建和使用方法RDD編程SparkSQLSparkStreamingSparkMLlib本書每個章節(jié)都安排了入門級的編程實踐操作,以便讀者更好地學(xué)習(xí)和掌握Spark編程方法。本書官網(wǎng)免費提供了全套的在線教學(xué)資源,包括講義PPT、習(xí)題、源代碼、軟件、數(shù)據(jù)集、授課視頻、上機實驗指南等。披荊斬棘在大數(shù)據(jù)叢林中開辟學(xué)習(xí)捷徑填溝削坎為快速學(xué)習(xí)Spark技術(shù)鋪平道路深入淺出有效降低Spark技術(shù)學(xué)習(xí)門檻資源全面構(gòu)建全方位一站式在線服務(wù)體系大數(shù)據(jù)技術(shù)概述第1章目
錄01大數(shù)據(jù)概念與關(guān)鍵技術(shù)02代表性大數(shù)據(jù)技術(shù)03編程語言的選擇大數(shù)據(jù)概念1.1.1大數(shù)據(jù)概念VARIETYVELOCITYVALUEVOLUME大量化快速化多樣化價值密度低4VVOLUME數(shù)據(jù)量大大量化1.1.1大數(shù)據(jù)概念人類社會數(shù)據(jù)每年50%的速度,每兩年就增長一倍根據(jù)IDC發(fā)布報告1.1.1大數(shù)據(jù)概念人類在最近兩年產(chǎn)生的數(shù)據(jù)量相當(dāng)于之前產(chǎn)生的全部數(shù)據(jù)量數(shù)據(jù)量大1.1.1大數(shù)據(jù)概念數(shù)據(jù)存儲單位之間的換算關(guān)系單位換算關(guān)系Byte(字節(jié))1Byte=8bitKB(Kilobyte,千字節(jié))1KB=1024ByteMB(Megabyte,兆字節(jié))1MB=1024KBGB(Gigabyte,吉字節(jié))1GB=1024MBTB(Trillionbyte,太字節(jié))1TB=1024GBPB(Petabyte,拍字節(jié))1PB=1024TBEB(Exabyte,艾字節(jié))1EB=1024PBZB(Zettabyte,澤字節(jié))1ZB=1024EB1.1.1大數(shù)據(jù)概念數(shù)據(jù)類型繁多VARIETY多樣化1.1.1大數(shù)據(jù)概念10%結(jié)構(gòu)化數(shù)據(jù)非結(jié)構(gòu)化數(shù)據(jù)90%存儲于關(guān)系型數(shù)據(jù)庫中存儲于非關(guān)系型數(shù)據(jù)庫中大數(shù)據(jù)90%1.1.1大數(shù)據(jù)概念數(shù)據(jù)類型繁多基因組-LHC加速器-地球與空間探測--查詢?nèi)罩?點擊流-Twitter/Blog/SNS-Wiki科學(xué)研究企業(yè)應(yīng)用Web1.0數(shù)據(jù)Web2.0數(shù)據(jù)-交易記錄-應(yīng)用日志-Email、文檔、文件文本-圖像-視頻-1.1.1大數(shù)據(jù)概念不同類型的數(shù)據(jù)1.1.1大數(shù)據(jù)概念VELOCITY快速化處理速度快1.1.1大數(shù)據(jù)概念一秒定律
從數(shù)據(jù)生成到?jīng)Q策響應(yīng)僅需1秒2萬次4.7萬次6萬次30萬次90萬次1秒定律1.1.1大數(shù)據(jù)概念價值密度低VALUE價值密度低有價值的數(shù)據(jù)海量數(shù)據(jù)1.1.1大數(shù)據(jù)概念價值密度低商業(yè)價值高1.1.1大數(shù)據(jù)概念大數(shù)據(jù)關(guān)鍵技術(shù)1.1.2大數(shù)據(jù)關(guān)鍵技術(shù)數(shù)據(jù)采集數(shù)據(jù)存儲與管理數(shù)據(jù)處理與分析數(shù)據(jù)隱私與安全1.1.2大數(shù)據(jù)關(guān)鍵技術(shù)數(shù)據(jù)源中的數(shù)據(jù)臨時中間層數(shù)據(jù)倉庫或數(shù)據(jù)集市ETL工具加
載數(shù)據(jù)采集1.1.2大數(shù)據(jù)關(guān)鍵技術(shù)數(shù)據(jù)存儲和管理云數(shù)據(jù)庫NoSQL數(shù)據(jù)庫分布式文件系統(tǒng)數(shù)據(jù)倉庫關(guān)系數(shù)據(jù)庫數(shù)據(jù)存儲和管理1.1.2大數(shù)據(jù)關(guān)鍵技術(shù)數(shù)據(jù)處理與分析分布式并行編程模型機器學(xué)習(xí)數(shù)據(jù)挖掘算法實現(xiàn)對海量數(shù)據(jù)的處理和分析1.1.2大數(shù)據(jù)關(guān)鍵技術(shù)數(shù)據(jù)可視化對分析結(jié)果進行可視化呈現(xiàn),幫助人們更好地理解數(shù)據(jù)、分析數(shù)據(jù)1.1.2大數(shù)據(jù)關(guān)鍵技術(shù)數(shù)據(jù)隱私和安全隱私數(shù)據(jù)保護體系數(shù)據(jù)安全保護體系1.1.2大數(shù)據(jù)關(guān)鍵技術(shù)數(shù)據(jù)存儲與管理數(shù)據(jù)處理與分析大數(shù)據(jù)1.1.2大數(shù)據(jù)關(guān)鍵技術(shù)分布式存儲分布式處理GFS\HDFSBigTable\HBaseNoSQLNewSQLMapReduceSparkFlink大數(shù)據(jù)1.1.2大數(shù)據(jù)關(guān)鍵技術(shù)大數(shù)據(jù)計算模式解決問題代表產(chǎn)品批處理計算針對大規(guī)模數(shù)據(jù)的批量處理MapReduce、Spark等流計算針對流數(shù)據(jù)的實時計算Flink、Storm、S4、Flume、Streams、Puma、DStream、SuperMario、銀河流數(shù)據(jù)處理平臺等圖計算針對大規(guī)模圖結(jié)構(gòu)數(shù)據(jù)的處理Pregel、GraphX、Giraph、PowerGraph、Hama、GoldenOrb等查詢分析計算大規(guī)模數(shù)據(jù)的存儲管理和查詢分析Dremel、Hive、Cassandra、Impala等大數(shù)據(jù)計算模式及其代表產(chǎn)品Hadoop1.2.1
Hadoop圖Hadoop生態(tài)系統(tǒng)1.2.1
HadoopReduceMapMapReduce1.2.1
Hadoop編程容易,不需要掌握分布式并行編程細節(jié)1.2.1
Hadoop分而治之圖MapReduce工作流程1.2.1
HadoopYARN實現(xiàn)“一個集群多個框架”1.2.1
Hadoop應(yīng)用場景1企業(yè)應(yīng)用場景2計算框架1計算框架2……業(yè)務(wù)……1.2.1
HadoopMapReduceImpalaStormSpark離線批處理實時交互式查詢分析流式數(shù)據(jù)實時分析迭代計算1.2.1
HadoopMapReduceImpalaStormSpark不同的開發(fā)團隊1.2.1
HadoopMapReduceImpalaStormSpark集群資源利用率低數(shù)據(jù)無法共享維護代價高1.2.1
Hadoop……StormImpalaHBase……Spark1.2.1
Hadoop……YARN資源調(diào)度管理框架StormImpalaHBase……Spark1.2.1
Hadoop各種計算框架圖
在YARN上部署各種計算框架1.2.1
Hadoop圖
在YARN上部署各種計算框架共享底層存儲Spark1.2.2
SparkSparkCoreSparkSQLSparkStreamingMLlibGraphXSpark架構(gòu)圖完成RDD應(yīng)用開發(fā)1.2.2
SparkSpark生態(tài)系統(tǒng)1.2.2
SparkVSSparkHadoopMapReduce1.2.2
SparkHadoopSpark缺點表達能力有限磁盤IO開銷大延遲高1.2.2
Spark延遲高任務(wù)任務(wù)涉及IO開銷1.2.2
Spark延遲高1.2.2
Spark延遲高HadoopMapReduce執(zhí)行流程1.2.2
SparkSpark編程模型更靈活多種數(shù)據(jù)集操作類型提供了內(nèi)存計算基于DAG的任務(wù)調(diào)度執(zhí)行機制優(yōu)點1.2.2
SparkHadoopMapReduce執(zhí)行流程Spark
執(zhí)行流程1.2.2
Spark圖
Hadoop與Spark執(zhí)行邏輯斯諦回歸的時間對比1.2.2
SparkQ1???Spark會取代Hadoop嗎?1.2.2
SparkHadoopHDFSMapReduceSpark取代1.2.2
SparkHadoopHDFSSparkHBase
數(shù)據(jù)的計算
數(shù)據(jù)的存儲Flink1.2.3FlinkFlink架構(gòu)圖1.2.3Flink0102030405都可以獲得較好的實時計算性能都支持類似SQL的編程接口都是用函數(shù)式編程模式都有完善的錯誤恢復(fù)機制都支持“精確一次”的語義一致性基于內(nèi)存的計算框架批處理和流處理APl轉(zhuǎn)換操作錯誤恢復(fù)機制語義一致性Flink和Spark共同點1.2.3FlinkFlink和Spark在API方面的比較APISparkFlink底層APIRDDProcessFunction核心APIDataFrame/DataSetDataStream/DataSetSQLSparkSQLTableAPI&SQL機器學(xué)習(xí)MLlibFlinkML圖計算GraphXGelly其他FlinkCEP1.2.3Flink
Flink
和
Spark
在支持語言方面的比較支持語言SparkFlinkJava√√Scala√√Python√√R√第三方SQL√√1.2.3Flink
Flink
和
Spark
在部署環(huán)境方面的比較部署環(huán)境SparkFlinkLocal(SingleJVM)√√StandaloneCluster√√YARN√√Mesos√√Kubernetes√√1.2.3Flink二者區(qū)別Spark基于批來模擬流的計算Flink是基于流計算來模擬批計算技術(shù)理念Flink是一條一條地處理數(shù)據(jù)Spark是基于RDD的小批量處理流計算處理方式Flink性能略好于Spark,F(xiàn)link支持增量迭代,具有對迭代進行自動優(yōu)化的功能在HadoopYARN上運行Beam1.2.4
Beam一統(tǒng)天下?1.2.4
Beam編程接口1.2.4
Beam編程語言選擇1.3編程語言的選擇R語言數(shù)據(jù)建模統(tǒng)計分析可視化1.3編程語言的選擇Python是目前國內(nèi)外很多大學(xué)里流行的入門語言,學(xué)習(xí)門檻低,簡單易用1.3編程語言的選擇最熱門的編程語言適合龐大的應(yīng)用系統(tǒng)1.3編程語言的選擇Scala是一門類似Java的多范式語言,它整合了面向?qū)ο缶幊毯秃瘮?shù)式編程的最佳特性1.3編程語言的選擇具備強大的并發(fā)性Scala兼容JavaScala代碼簡潔優(yōu)雅Scala支持高效的交互式編程Scala是Spark的開發(fā)語言1.3編程語言的選擇原生接口數(shù)據(jù)分析接口SparkRPySpark1.3編程語言的選擇Q1???開發(fā)Spark程序使用什么編程語言?1.3編程語言的選擇開發(fā)Spark應(yīng)用程序ScalaPythonJavaR語言1.3編程語言的選擇0102在并發(fā)性能上Scala明顯優(yōu)于Python,Scala是靜態(tài)類型,可以在編譯階段就拋出錯誤,便于開發(fā)大型大數(shù)據(jù)項目,此外,Scala兼容Java,運行在JVM上,可用Java中的HadoopAPI和Hadoop進行交互,但Python與Hadoop間的交互通常需要第三方庫Python語言并發(fā)性能不好在大數(shù)據(jù)應(yīng)用場景中,不太適合使用Java,因為完成同樣的任務(wù),Scala只需要一行代碼,而Java則可能需要10行代碼;Scala語言可支持交互式編程,大大提高了程序開發(fā)效率,而Java不支持交互式執(zhí)行,必須編譯以后運行Java代碼太繁瑣謝謝!Scala語言基礎(chǔ)第2章目
錄01Scala語言概述02Scala基礎(chǔ)知識03面向?qū)ο缶幊袒A(chǔ)04函數(shù)式編程基礎(chǔ)Scala語言概述2.1.1計算機的緣起人類社會超級計算裝置?阿隆佐?邱奇設(shè)計了λ演算用于研究函數(shù)定義、函數(shù)應(yīng)用、遞歸的形式系統(tǒng)2.1.1計算機的緣起可計算的函數(shù)表達求值λ
演算2.1.1計算機的緣起一個形式系統(tǒng)計算機不能真正實現(xiàn)λ
演算2.1.1計算機的緣起英國數(shù)學(xué)家阿蘭·圖靈圖靈機2.1.1計算機的緣起λ演算圖靈機λ
演算計算能力2.1.1計算機的緣起阿隆佐?邱奇阿蘭·圖靈學(xué)習(xí)編程語言和計算機2.1.1計算機的緣起將圖靈的理論物化成為實際的物理實體,成為了計算機體系結(jié)構(gòu)的奠基者。1945年6月,馮·諾依曼提出了在數(shù)字計算機內(nèi)部的存儲器中存放程序的概念,這是所有現(xiàn)代計算機的范式,被稱為“馮·諾依曼結(jié)構(gòu)”計算機體系結(jié)構(gòu)的奠基者
馮·諾依曼輸入設(shè)備存儲器輸出設(shè)備控制器運算器CPU數(shù)據(jù)流指令流控制流“馮·諾依曼結(jié)構(gòu)”保存數(shù)據(jù)與程序發(fā)生運算統(tǒng)一調(diào)度2.1.1計算機的緣起函數(shù)式編程命令式編程編程范式編程的基本風(fēng)格2.1.2
編程范式命令式語言馮·諾依曼體系命令馮?諾依曼機器的指令序列命令式程序程序執(zhí)行2.1.2
編程范式λ
演算泛函編程函數(shù)式編程2.1.2
編程范式近些年函數(shù)式編程會迅速升溫呢?命令式編程函數(shù)式編程2.1.2
編程范式涉及多線程之間的狀態(tài)共享命令式編程保證數(shù)據(jù)的一致性鎖機制函數(shù)式編程鎖機制不會在多個線程之間并發(fā)處理2.1.2
編程范式2.1.3Scala簡介面對象編程風(fēng)格函數(shù)式編程風(fēng)格2.1.3Scala簡介Java虛擬機(JVM)Scala特點兼容現(xiàn)有的Java程序2.1.3Scala簡介面向?qū)ο蟮恼Z言一門函數(shù)式語言2.1.3Scala簡介MartinOdersky(Scala之父)詹姆斯·高斯林(Java之父)詹姆斯·高斯林(Java之父)“IfIweretopickalanguagetousetodayotherthanJava,itwouldbeScala.”
—JamesGosling
2.1.3Scala簡介2.1.4Scala的安裝2.1.4Scala的安裝/blog/929-2/2.1.4Scala的安裝2.1.4Scala的安裝支持多種操作系統(tǒng)WindowLinuxMacOS2.1.4Scala的安裝Linux系統(tǒng)的安裝方法/blog/1257-2/2.1.4Scala的安裝直接通過命令安裝OpenJDK7配置JAVA_HOME環(huán)境變量,用下面的命令打開配置文件$sudoapt-getinstallopenjdk-8-jreopenjdk-8-jdk$vim~/.bashrc在文件開頭增加如下語句exportJAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64在Linux系統(tǒng)中安裝Java2.1.4Scala的安裝退出文件編輯,并運行如下命令使配置立即生效配置JAVA_HOME環(huán)境變量,用下面的命令打開配置文件$source~/.bashrc#使變量設(shè)置生效$java-versionopenjdkversion“11.0.15”2022-04-19#輸出當(dāng)前版本號和編譯時間在Linux系統(tǒng)中安裝Java2.1.4Scala的安裝安裝Scala2.12.15版本3.2.0版本2.1.4Scala的安裝登錄Scala官網(wǎng),下載scala-2.12.15.tgz$source~/.bashrc$sudotar-zxf~/下載/scala-2.12.15.tgz-C/usr/local#解壓到/usr/local中$cd/usr/local/$sudomv./scala-2.12.15/./scala#將文件夾名改為scala$sudochown-Rhadoop./scala#使hadoop用戶擁有對scala目錄的權(quán)限安裝Scala
對應(yīng)的Scala版本是2.12.152.1.4Scala的安裝修改配置文件,把scala命令路徑添加到path環(huán)境變量中檢驗一下是否設(shè)置正確$vim~/.bashrc$scala–versionScalacoderunnerversion2.12.15...#省略了部分輸出安裝Scala
對應(yīng)的Scala版本是2.12.15exportPATH=$PATH:/usr/local/scala/bin2.1.5HelloWorld可以使用命令“:quit”退出Scala解釋器在Shell命令提示符界面中輸入“scala”命令后,會進入scala命令行提示符狀態(tài)scala>//可以在命令提示符后面輸入命令通過HelloWorld程序了解Scala解釋器的使用方法scala>:quit2.1.4Scala的安裝在
Scala
解釋器中運行腳本文件用“:load”命令導(dǎo)入腳本,一次運行多行程序:使用文本編輯器(比如vim)創(chuàng)建一個代碼文件Test.scala在ScalaREPL中執(zhí)行如下命令運行該代碼文件://代碼文件為/usr/local/scala/mycode/Test.scalaprintln("Thisisthefirstline")println("Thisisthesecondline")println("Thisisthethirdline")scala>:load/usr/local/scala/mycode/Test.scalaLoading/usr/local/scala/mycode/Test.scala…ThisisthefirstlineThisisthesecondlineThisisthethirdline2.1.4Scala的安裝通過編譯打包的方式運行Scala程序使用scalac命令進行編譯(編譯的結(jié)果為Java字節(jié)碼)使用scala或者java命令運行字節(jié)碼文件//代碼文件為/usr/local/scala/mycode/HelloWorld.scalaobjectHelloWorld{defmain(args:Array[String]){println("Hello,world!");}}$cd/usr/local/scala/mycode$scalacHelloWorld.scala$scala-classpath.HelloWorld$java-classpath.:/usr/local/scala/lib/scala-library.jarHelloWorldScala基礎(chǔ)知識2.2Scala基礎(chǔ)知識提綱2輸入輸出3控制結(jié)構(gòu)1基本數(shù)據(jù)類型和變量4數(shù)據(jù)結(jié)構(gòu)2.2.1
基本數(shù)據(jù)類型和變量基本數(shù)據(jù)類型基本操作變量2.2.1
基本數(shù)據(jù)類型和變量基本數(shù)據(jù)類型BooleanByteCharShortIntLongFloatDouble2.2.1
基本數(shù)據(jù)類型和變量Int類型scala.Int類2.2.1
基本數(shù)據(jù)類型和變量java.lang.String2.2.1
基本數(shù)據(jù)類型和變量數(shù)據(jù)類型取值范圍Byte8位有符號補碼整數(shù)(-27~27-1)short16位有符號補碼整數(shù)(-215~215-1)Int32位有符號補碼整數(shù)(-231~231-1)Long64位有符號補碼整數(shù)(-263~263-1)Char16位無符號補碼整數(shù)(0~216-1)String字符序列Float32位IEEE754單精度浮點數(shù)Double64位IEEE754單精度浮點數(shù)Booleantrue或false2.2.1
基本數(shù)據(jù)類型和變量vali=123//123就是整數(shù)字面量vali=3.14//3.14就是浮點數(shù)字面量vali=true//true就是布爾型字面量vali='A'//'A'就是字符字面量vali=“Hello”//“Hello”就是字符串字面量
字面量(literal)2.2.1
基本數(shù)據(jù)類型和變量操作符類型操作符算術(shù)運算符加(+)、減(-)、乘(*)、除(/)、余數(shù)(%)關(guān)系運算符大于(>)、小于(<)、等于(==)、不等于(!=)、大于等于(>=)、小于等于(<=)邏輯運算符邏輯與(&&)、邏輯或(||)、邏輯非(!)位運算符按位與(&)、按位或(|)、按位異或(^)、按位取反(~)等賦值運算符=及其與其它運算符結(jié)合的擴展賦值運算符,例如+=、%=2.2.1
基本數(shù)據(jù)類型和變量
操作符優(yōu)先級算術(shù)運算符>>>關(guān)系運算符邏輯運算符賦值運算符2.2.1
基本數(shù)據(jù)類型和變量
scala>valsum1=5+3//實際上調(diào)用了(5).+(3)sum1:Int=8scala>valsum2=(5).+(3)
//可以發(fā)現(xiàn),寫成方法調(diào)用的形式,和上面得到相同
的結(jié)果sum2:Int=8a.方法(b)a方法b
操作符定義成方法2.2.1
基本數(shù)據(jù)類型和變量富包裝類RichInt類RichStringIntStringmaxscala.runtime2.2.1
基本數(shù)據(jù)類型和變量富包裝類35maxInt類型Int類型對象不屬于這個Int類型的方法Scala會自動通過隱式轉(zhuǎn)換將該對象轉(zhuǎn)換為對應(yīng)的富包裝類型,然后再調(diào)用相應(yīng)的方法2.2.1
基本數(shù)據(jù)類型和變量變量不可變可變函數(shù)式編程面向?qū)ο缶幊?.2.1
基本數(shù)據(jù)類型和變量val不可變聲明時必須初始化不能再賦值var可變的聲明時需要初始化可以再賦值valvar不同類型變量2.2.1
基本數(shù)據(jù)類型和變量val變量名:數(shù)據(jù)類型=初始值
var
變量名:數(shù)據(jù)類型=初始值valvar規(guī)范格式2.2.1
基本數(shù)據(jù)類型和變量類型推斷機制:根據(jù)初始值自動推斷變量的類型scala>valmyStr="HelloWorld!"myStr:String=HelloWorld!當(dāng)然,我們也可以顯式聲明變量的類型scala>valmyStr2:String="HelloWorld!"myStr2:String=HelloWorld!scala>myStr="HelloScala!"<console>:27:error:reassignmenttovalmyStr="HelloScala!"^myStr是val變量,因此,一旦初始化以后,就不能再次賦值2.2.1
基本數(shù)據(jù)類型和變量scala>varmyPrice:Double=9.9myPrice:Double=9.9scala>myPrice=10.6myPrice:Double=10.6var變量初始化以后,可以再次賦值注意:在REPL環(huán)境下,可以重復(fù)使用同一個變量名來定義變量,而且變量前的修飾符和其類型都可以不一致,REPL會以最新的一個定義為準(zhǔn)scala>vala="XiamenUniversity"a:String=XiamenUniversityscala>vara=50a:Int=50類型推斷機制:根據(jù)初始值自動推斷變量的類型2.2.2輸入輸出控制臺輸入輸出語句讀寫文件輸入輸出(scala.io.StdIn)readIntreadShortreadCharreadDoublereadFloatreadBooleanreadBytereadLongreadLine從控制臺讀入數(shù)據(jù)的方法2.2.2輸入輸出使用前,必須導(dǎo)入直接用全稱進行調(diào)用scala.io.StdIn從控制臺讀入數(shù)據(jù)的方法2.2.2輸入輸出2.2.2輸入輸出控制臺輸入輸出語句:從控制臺讀入數(shù)據(jù)方法scala>importio.StdIn._importio.StdIn._scala>vari=readInt()54i:Int=54scala>varf=readFloat1.618f:Float=1.618scala>varb=readBooleantrueb:Boolean=truescala>varstr=readLine("pleaseinputyourname:")pleaseinputyourname:LiLeistr:String=LiLei2.2.2輸入輸出scala>vali=345i:Int=345scala>print("i=");print(i)//兩條語句位于同一行,不能省略中間的分號i=345scala>println("hello");println("world")helloworld控制臺輸入輸出語句:C語言風(fēng)格格式化字符串的printf()函數(shù)print()和println(),可直接輸出字符串或者其它數(shù)據(jù)類型,println在末尾自動換行2.2.2輸入輸出C語言printf%C語言風(fēng)格的格式化字符串Scala繼承了C語言格式化字符串的風(fēng)格加各種各樣的格式化字符串2.2.2輸入輸出控制臺輸入輸出語句:C語言風(fēng)格格式化字符串的printf()函數(shù)print()、println()和printf()都在對象Predef中定義,該對象默認(rèn)情況下被所有的Scala程序引用,可直接使用Predef對象提供的方法,無需使用scala.Predef.的形式scala>vali=34i:Int=34scala>valf=56.5f:Double=56.5scala>printf("Iam%dyearsoldandweight%.1fKg.","LiLie",i,f)Iam34yearsoldandweight56.5Kg.2.2.2輸入輸出控制臺輸入輸出語句字符串插值機制s字符串f字符串2.2.2輸入輸出控制臺輸入輸出語句:s字符串和f字符串基本語法:s"…$變量名…"或f"…$變量名%格式化字符…"scala>vali=10i:Int=10scala>valf=3.5f:Double=3.5452scala>vals="hello"s:String=helloscala>println(s"$s:i=$i,f=$f")//s插值字符串hello:i=10,f=3.5452scala>println(f"$s:i=$i%-4d,f=$f%.1f")//f插值字符串hello:i=10,f=3.52.2.2輸入輸出控制臺輸入輸出語句讀寫文件輸入輸出2.2.2輸入輸出寫入文件java.io.PrintWriterprintlnprint2.2.2輸入輸出讀寫文件:Scala需要使用java.io.PrintWriter實現(xiàn)把數(shù)據(jù)寫入到文件PrintWriter類提供了print和println兩個寫方法scala>importjava.io.PrintWriterscala>valoutputFile=newPrintWriter("test.txt")scala>outputFile.println("HelloWorld")scala>outputFile.print("Sparkisgood")scala>outputFile.close()2.2.2輸入輸出讀取文件:用scala.io.Source的getLines方法實現(xiàn)對文件中所有行的讀取2.2.3控制結(jié)構(gòu)if條件表達式while循環(huán)for循環(huán)異常處理對循環(huán)的控制2.2.3控制結(jié)構(gòu)控制結(jié)構(gòu):if條件表達式if(表達式){
語句塊1}else{
語句塊2}valx=6if(x>0){println(“Thisisapositivenumber”)}else{println(“Thisisnotapositivenumber”)}2.2.3控制結(jié)構(gòu)控制結(jié)構(gòu):if
條件表達式valx=3if(x>0){println(“Thisisapositivenumber”)}elseif(x==0){println(Thisisazero”)}else{println(“Thisisanegativenumber”)}2.2.3控制結(jié)構(gòu)if
表達式可以再次賦值給變量2.2.3控制結(jié)構(gòu)控制結(jié)構(gòu):if條件表達式valx=6vala=if(x>0)1else-12.2.3控制結(jié)構(gòu)while(表達式){
循環(huán)體}do{
循環(huán)體}while(表達式)控制結(jié)構(gòu):while循環(huán)2.2.3控制結(jié)構(gòu)vari=9while(i>0){i-=1printf(“iis%d\n”,i)}vari=0do{i+=1printf(i)}while(i<5)可變類型的變量i不小于5它就退出循環(huán)i等于0以后它就停止執(zhí)行控制結(jié)構(gòu):while循環(huán)2.2.3控制結(jié)構(gòu)生成器(generator)for
(變量
<-表達式){語句塊}for循環(huán)2.2.3控制結(jié)構(gòu)for(i<-1to5)println(i)for(i<-1to5by2)println(i)12345135控制結(jié)構(gòu):for循環(huán)2.2.3控制結(jié)構(gòu)for(i<-1to5ifi%2==0)println(i)24for(變量<-表達式if
條件表達式)語句塊控制結(jié)構(gòu):for循環(huán)—“守衛(wèi)(guard)”的表達式2.2.3控制結(jié)構(gòu)12324636for(i<-1to5;j<-1to3)println(i*j)9481251015支持“多個生成器”的情形,用分號隔開2.2.3控制結(jié)構(gòu)生成器for推導(dǎo)式for(變量<-表達式)yield{語句塊}scala>valr=for(i<-Array(1,2,3,4,5)ifi%2==0)yield{println(i);i}24r:Array[Int]=Array(2,4)2.2.3控制結(jié)構(gòu)異常處理
受檢異常(checkedexception)
不受檢異常(uncheckedexception)2.2.3控制結(jié)構(gòu)受檢異常清晰地知道錯誤代碼的執(zhí)行過程寫代碼的時候2.2.3控制結(jié)構(gòu)受檢異常錯誤處理方法代碼的執(zhí)行過程2.2.3控制結(jié)構(gòu)不受檢異常錯誤代碼的運行過程2.2.3控制結(jié)構(gòu)受檢異常優(yōu)點在編程之前運行過程中會產(chǎn)生的錯誤2.2.3控制結(jié)構(gòu)受檢異常優(yōu)點寫代碼時錯誤1錯誤2錯誤3……處理方式1處理方式2處理方式3……2.2.3控制結(jié)構(gòu)不受檢異常(uncheckedexception)異常處理受檢異常(checkedexception)2.2.3控制結(jié)構(gòu)import
java.io.FileReader
import
java.io.FileNotFoundException
import
java.io.IOException
try
{
valf=new
FileReader("input.txt")
//文件操作}
catch
{
caseex:FileNotFoundException=>
//文件不存在時的操作
caseex:IOException=>
//發(fā)生I/O錯誤時的操作}finally
{
file.close()//確保關(guān)閉文件}
控制結(jié)構(gòu):for循環(huán)2.2.3控制結(jié)構(gòu)對循環(huán)的控制breakcontinue2.2.3控制結(jié)構(gòu)Breaks類(包scala.util.control)對循環(huán)的控制2.2.3控制結(jié)構(gòu)Breaks類(包scala.util.control)breakbreakable2.2.3控制結(jié)構(gòu)breakable{...if(...)break...}Breaks類(包scala.util.control)2.2.3控制結(jié)構(gòu)控制結(jié)構(gòu):對循環(huán)的控制//代碼文件為/usr/local/scala/mycode/TestBreak.scalaimportutil.control.Breaks._//導(dǎo)入Breaks類的所有方法valarray=Array(1,3,10,5,4)breakable{for(i<-array){ if(i>5)break//跳出breakable,終止for循環(huán),相當(dāng)于Java中的breakprintln(i) }}//上面的for語句將輸出1,32.2.3控制結(jié)構(gòu)控制結(jié)構(gòu):對循環(huán)的控制for(i<-array){ breakable{ if(i>5)break//跳出breakable,終止當(dāng)次循環(huán),相當(dāng)于Java的continue println(i) }}//上面的for語句將輸出1,3,5,42.2.4數(shù)據(jù)結(jié)構(gòu)數(shù)組Array元組Tuple容器Collection序列Sequence集合Set映射Map迭代器Iterator2.2.4數(shù)據(jù)結(jié)構(gòu)數(shù)組(Array)可變的可索引的元素是相同類型2.2.4數(shù)據(jù)結(jié)構(gòu)提供了參數(shù)化類型的通用數(shù)組類Array[T]2.2.4數(shù)據(jù)結(jié)構(gòu)數(shù)組(Array):對循環(huán)的控制—聲明一個整型數(shù)組valintValueArr=newArray[Int](3)//聲明一個長度為3的整型數(shù)組,每個數(shù)組元素初始化為0intValueArr(0)=12//給第1個數(shù)組元素賦值為12intValueArr(1)=45//給第2個數(shù)組元素賦值為45intValueArr(2)=33//給第3個數(shù)組元素賦值為332.2.4數(shù)據(jù)結(jié)構(gòu)數(shù)組(Array):聲明一個字符串?dāng)?shù)組valmyStrArr=newArray[String](3)//聲明一個長度為3的字符串?dāng)?shù)組,每個數(shù)組元素初始化為nullmyStrArr(0)="BigData"myStrArr(1)="Hadoop"myStrArr(2)="Spark"for(i<-0to2)println(myStrArr(i))2.2.4數(shù)據(jù)結(jié)構(gòu)數(shù)組(Array):可不給出數(shù)組類型,Scala會自動根據(jù)初始化數(shù)據(jù)來推斷數(shù)組類型valintValueArr=Array(12,45,33)valmyStrArr=Array("BigData","Hadoop","Spark")數(shù)組(Array):多維數(shù)組的創(chuàng)建:調(diào)用Array的ofDim方法valmyMatrix=Array.ofDim[Int](3,4)//類型實際就是Array[Array[Int]]valmyCube=Array.ofDim[String](3,2,4)//類型實際是Array[Array[Array[String]]可以使用多級圓括號來訪問多維數(shù)組的元素,例如myMatrix(0)(1)返回第一行第二列的元素2.2.4數(shù)據(jù)結(jié)構(gòu)對多個不同類型對象的一種簡單封裝元組(Tuple)2.2.4數(shù)據(jù)結(jié)構(gòu)元組(Tuple):定義元組是把多個元素用逗號分開并用圓括號包圍起來使用下劃線“_”加上從1開始的索引值,來訪問元組的元素2.2.4數(shù)據(jù)結(jié)構(gòu)可返回多個不同類型對象元組(Tuple)tuple2.2.4數(shù)據(jù)結(jié)構(gòu)(Collection)容器(Set)集合2.2.4數(shù)據(jù)結(jié)構(gòu)容器庫
提供序列集合映射2.2.4數(shù)據(jù)結(jié)構(gòu)容器類的三個包scala.collectionscala.collection.immutablescala.collection.mutable
容器(Collection)2.2.4數(shù)據(jù)結(jié)構(gòu)scala.collection容器(Collection)可變?nèi)萜鞑豢勺內(nèi)萜鞣庋b了一些超類或特質(zhì)2.2.4數(shù)據(jù)結(jié)構(gòu)scala.collection定義了一些可變?nèi)萜骱筒豢勺兊囊恍┩ㄓ貌僮鱯cala.collection包中容器的宏觀層次結(jié)構(gòu)2.2.4數(shù)據(jù)結(jié)構(gòu)2.2.4數(shù)據(jù)結(jié)構(gòu)序
列元素可以按照特定的順序訪問的容器
序列(Sequence)
2.2.4數(shù)據(jù)結(jié)構(gòu)序列中元素都帶從0開始計數(shù)的固定索引位置
序列(Sequence)
2.2.4數(shù)據(jù)結(jié)構(gòu)序列容器根collection.Seq2.2.4數(shù)據(jù)結(jié)構(gòu)LinearSeq有高效的隨機存取操作IndexedSeqSeq取頭或取尾巴操作2.2.4數(shù)據(jù)結(jié)構(gòu)LinearSeq列表隊列可變數(shù)組(ArrayBuffer)
向量(Vector)共享相同類型的不可變的對象序列列表(List)列表List容器類scala.collection.immutable2.2.4數(shù)據(jù)結(jié)構(gòu)列表的值不可變列表(List)的特征2.2.4數(shù)據(jù)結(jié)構(gòu)varstrList=List("BigData","Hadoop","Spark")列表(List)的初始化2.2.4數(shù)據(jù)結(jié)構(gòu)List頭部尾部headtail列表(List)返回的是列表第一個元素的值返回的是除第一個元素外的其它值構(gòu)成的新列表2.2.4數(shù)據(jù)結(jié)構(gòu)varstrList=List("BigData","Hadoop","Spark")列表(List)的初始化strList.head2.2.4數(shù)據(jù)結(jié)構(gòu)varstrList=List("BigData","Hadoop","Spark")列表(List)的初始化strList.tail2.2.4數(shù)據(jù)結(jié)構(gòu)向已有列表
前端增加元素構(gòu)造列表常用的方法2.2.4數(shù)據(jù)結(jié)構(gòu)構(gòu)造列表常用的方法valotherList="Apache"::strList操作符2.2.4數(shù)據(jù)結(jié)構(gòu)otherListList("BigData","Hadoop","Spark")strListList("Apache","BigData","Hadoop","Spark")2.2.4數(shù)據(jù)結(jié)構(gòu)01valintList=List(1,2,3)構(gòu)造列表常用的方法02valintList=1::2::3::Nil2.2.4數(shù)據(jù)結(jié)構(gòu)注意:除了head、tail操作是常數(shù)時間O(1),其它按索引訪問的操作都需要從頭開始遍歷,因此是線性時間復(fù)雜度O(N)。2.2.4數(shù)據(jù)結(jié)構(gòu)序列(Sequence)—向量(Vector):Vetor可實現(xiàn)所有訪問操作都是常數(shù)時間scala>valvec1=Vector(1,2)vec1:scala.collection.immutable.Vector[Int]=Vector(1,2,3)scala>valvec2=3+:4+:vec1vec2:scala.collection.immutable.Vector[Int]=Vector(3,4,1,2)scala>valvec3=vec2:+5vec3:scala.collection.immutable.Vector[Int]=Vector(3,4,1,2,5)scala>vec3(3)res6:Int=22.2.4數(shù)據(jù)結(jié)構(gòu)一種特殊的帶索引的不可變數(shù)字等差序列從給定起點按一定步長增長(減小)到指定終點的所有數(shù)值Range2.2.4數(shù)據(jù)結(jié)構(gòu)RangeIntBigDecimalLongBigIntFloatDoubleChar2.2.4數(shù)據(jù)結(jié)構(gòu)步長1to5by2起點終點Range2.2.4數(shù)據(jù)結(jié)構(gòu)scala>valr=newRange(1,5,1)scala>1to5res0:scala.collection.immutable.Range.Inclusive=Range(1,2,3,4,5)scala>1.to(5)res1:scala.collection.immutable.Range.Inclusive=Range(1,2,3,4,5)序列(Sequence):創(chuàng)建一個從1到5的數(shù)值序列,包含區(qū)間終點5,步長為12.2.4數(shù)據(jù)結(jié)構(gòu)創(chuàng)建一個從1到5的數(shù)值序列,不包含區(qū)間終點5,步長為1創(chuàng)建一個從1到10的數(shù)值序列,包含區(qū)間終點10,步長為2創(chuàng)建一個Float類型的數(shù)值序列,從0.5f到5.9f,步長為0.3f2.2.4數(shù)據(jù)結(jié)構(gòu)2.2.4數(shù)據(jù)結(jié)構(gòu)集合(Set)不重復(fù)元素的容器(collection)2.2.4數(shù)據(jù)結(jié)構(gòu)有些數(shù)據(jù)結(jié)構(gòu)元素重復(fù)2.2.4數(shù)據(jù)結(jié)構(gòu)集合(Set)集合元素重復(fù)2.2.4數(shù)據(jù)結(jié)構(gòu)先后51234列表(List)2.2.4數(shù)據(jù)結(jié)構(gòu)快速找到某個具體值集合哈希方法2.2.4數(shù)據(jù)結(jié)構(gòu)從頭到尾遍歷列表查找某個元素2.2.4數(shù)據(jù)結(jié)構(gòu)集合(Set)scala.collection.mutable包集合(Set)可變集不可變集scala.collection.immutable包2.2.4數(shù)據(jù)結(jié)構(gòu)集合(Set):可變類型的變量varmySet=Set("Hadoop","Spark")mySet+="Scala"生成不可變集的對象2.2.4數(shù)據(jù)結(jié)構(gòu)集合(Set):可變類型的變量,聲明一個可變集importscala.collection.mutable.SetvalmyMutableSet=Set("Database","BigData")myMutableSet+="CloudComputing"myMutableSetSet("Database","BigData")Set(“Database”,“BigData”,"CloudComputing")2.2.4數(shù)據(jù)結(jié)構(gòu)一系列鍵值對的容器,鍵是唯一的,但值不一定唯一鍵1鍵2值1值2映射(Map)2.2.4數(shù)據(jù)結(jié)構(gòu)映射(Map)不可變可變scala.collection.mutable包scala.collection.immutable包(默認(rèn))2.2.4數(shù)據(jù)結(jié)構(gòu)映射(Map)可變scala.collection.mutable包不可變scala.collection.immutable包映射
(Map)
:具體實例valuniversity=Map("XMU"->"XiamenUniversity","THU"->"TsinghuaUniversity","PKU"->"PekingUniversity")如果要獲取映射中的值,可以通過鍵來獲取若給定鍵不存在,則會拋出異常,訪問前可先調(diào)用contains方法確定鍵是否存在println(university("XMU"))valxmu=if(university.contains("XMU"))university("XMU")else02.2.4數(shù)據(jù)結(jié)構(gòu)2.2.4數(shù)據(jù)結(jié)構(gòu)映射
(Map)
:可變的映射具體實例也可以使用+=操作來添加新的元素importscala.collection.mutable.Mapvaluniversity2=Map("XMU"->"XiamenUniversity","THU"->"TsinghuaUniversity","PKU"->"PekingUniversity")university2("XMU")="XimanUniversity"http://更新已有元素的值university2("FZU")="FuzhouUniversity"http://添加新元素university2+=("TJU"->"TianjinUniversity")//添加一個新元素university2+=("SDU"->"ShandongUniversity","WHU"->"WuhanUniversity")//同時添加兩個新元素2.2.4數(shù)據(jù)結(jié)構(gòu)按順序訪問容器容
器數(shù)據(jù)結(jié)構(gòu)迭代器(Iterator)2.2.4數(shù)據(jù)結(jié)構(gòu)返回迭代器的下一個元素檢測是否還有下一個元素迭代器(Iterator)nexthasNext2.2.4數(shù)據(jù)結(jié)構(gòu)迭代器(Iterator):迭代器基本操作具體實例建議:除next和hasnext方法外在對一個迭代器調(diào)用了某個方法后,不要再次使用該迭代器val
iter=Iterator("Hadoop","Spark","Scala")while(iter.hasNext){
println(iter.next())}面向?qū)ο缶幊袒A(chǔ)2.3.1類目錄2.3.1類2.3.2對象2.3.3繼承2.3.4參數(shù)化類型2.3.5特質(zhì)2.3.6模式匹配2.3.7包2.3.1類類的定義1類成員的可見性2方法的定義方式3構(gòu)造器42.3.1類類的定義
:
具體實例classCounter{//這里定義類的字段和方法}修飾關(guān)鍵詞val定義可變的變量修飾關(guān)鍵詞var定義不可變的變量2.3.1類類的定義
:方法定義和具體實例def方法名(參數(shù)列表):返回結(jié)果類型={方法體}classCounter{varvalue=0defincrement(step:Int):Unit={value+=step}defcurrent():Int={value}}2.3.1類類的定義
:
具體實例使用new關(guān)鍵字創(chuàng)建一個類的實例classCounter{varvalue=0defincrement(step:Int):Unit={value+=step}defcurrent():Int={value}}valmyCounter=newCountermyCounter.value=5//訪問字段myCounter.increment(3)//調(diào)用方法println(myCounter.current)//調(diào)用無參數(shù)方法時,可以省略方法名后的括號2.3.1類類成員的可見性privateprotected決定類成員的可見范圍2.3.1類私
有Scala類privateprotected本類型可見嵌套類型可見本類型可見其它繼承類型可見標(biāo)題文字不暴露內(nèi)部字段2.3.1類設(shè)置getter方法設(shè)置setter方法封裝聲明私有2.3.1類標(biāo)題文字public字段類成員的可見性設(shè)置成私有2.3.1類讀取變量值寫入新的值settergetter2.3.1類valuevalue_=讀取修改2.3.1類類成員的可見性
:
具體實例//代碼文件為/usr/local/scala/mycode/Counter.scalaclassCounter{privatevarprivateValue=0defvalue=privateValuedefvalue_=(newValue:Int){if(newValue>0)privateValue=newValue}defincrement(step:Int):Unit={value+=step}defcurrent():Int={value}}2.3.1類類成員的可見性
:
具體實例scala>:load/usr/local/scala/mycode/Counter.scalaLoading/usr/local/scala/mycode/Counter.scala…definedclassCounterscala>valmyCounter=newCountermyCounter:Counter=Counter@f591271scala>myCounter.value_=(3)//為privateValue設(shè)置新的值scala>println(myCounter.value)//訪問privateValue的當(dāng)前值3myCounter.value=3//等效于myCounter.value_=(3)2.3.1類方法定義:def方法名(參數(shù)列表):返回結(jié)果類型={方法體}參數(shù)不能用val和var作為前綴去修飾沒有參數(shù)的方法在定義的時候是可以圓括號省略掉的類成員的可見性
:
方法的定義方式2.3.1類類成員的可見性
:
方法的定義方式方法定義:def方法名(參數(shù)列表):返回結(jié)果類型={方法體}一個方法如果只有一個參數(shù)可以省略圓點而采用中綴操作符調(diào)用方法2.3.1類整數(shù)調(diào)用中綴操作符調(diào)用方法aa.+(b)對象a+b2.3.1類類成員的可見性
:
方法的定義方式//代碼文件為/usr/local/scala/mycode/Counter1.scalaclassCounter{varvalue=0defincrement(step:Int):Unit={value+=step}defcurrent:Int=valuedefgetValue():Int=value}2.3.1類類成員的可見性
:
方法的定義方式scala>:load/usr/local/scala/mycode/Counter1.scalaLoading/usr/local/scala/mycode/Counter1.scala…definedclassCounterscala>valc=newCounterc:Counter=Counter@30ab4b0escala>cincrement5//中綴調(diào)用法scala>c.getValue()//getValue定義中有括號,可以帶括號調(diào)用res0:Int=02.3.1類類成員的可見性
:
方法的定義方式scala>c.getValue//getValue定義中有括號,也可不帶括號調(diào)用res1:Int=0scala>c.current()//current定義中沒有括號,不可帶括號調(diào)用<console>:13:error:Intdoesnottakeparametersc.current()^scala>c.current//current定義中沒有括號,只能不帶括號調(diào)用res3:Int=02.3.1類80可以省略結(jié)果類型返回結(jié)果可推斷可以同時省略返回結(jié)果類型和等號,但不能省略大括號返回類型為UnitclassCounter{varvalue=0defincrement(step:Int){value+=step}//賦值表達式的值為Unit類型defcurrent()=value//根據(jù)value的類型自動推斷出返回類型為Int型}2.3.1類構(gòu)造器類主構(gòu)造器2.3.1類Scala構(gòu)造器類名稱(參數(shù)列表)用圓括號2.3.1類val
var修飾在方法定義里面的參數(shù)列表參數(shù)2.3.1類主構(gòu)造器關(guān)鍵字var關(guān)鍵字val2.3.1類放在主構(gòu)造器參數(shù)列表里面的參數(shù)自動變成它的類內(nèi)部的成員字段2.3.1類構(gòu)造器:如果不希望構(gòu)造器參數(shù)成為類的字段,只需省略關(guān)鍵字var或者valscala>classCounter(varname:String)//定義一個帶字符串參數(shù)的簡單類definedclassCounterscala>varmycounter=newCounter("Runner")mycounter:Counter=Counter@17fcc4f7scala>println()//調(diào)用讀方法Runnerscala>_=("Timer")//調(diào)用寫方法scala>="Timer"http://更直觀地調(diào)用寫方法,和上句等效:String=Timer2.3.1類主構(gòu)造器輔助構(gòu)造器2.3.1類類(參數(shù))(參數(shù))(參數(shù))定義不同的構(gòu)造器與輔助構(gòu)造器,this的返回類型為UnitThis(參數(shù)列表)2.3.1類//代碼文件為/usr/local/scala/mycode/Counter2.scalaclassCounter{privatevarvalue=0privatevarname=""privatevarstep=1//計算器的默認(rèn)遞進步長
println("themainconstructor")defthis(name:String){//第一個輔助構(gòu)造器
this()//調(diào)用主構(gòu)造器
=nameprintf("thefirstauxiliaryconstructor,name:%s\n",name)}defthis(name:String,step:Int){//第二個輔助構(gòu)造器
this(name)//調(diào)用前一個輔助構(gòu)造器
this.step=stepprintf("thesecondauxiliaryconstructor,name:%s,step:%d\n",name,step)}defincrement(step:Int):Unit={value+=step}defcurrent():Int={value}}2.3.1類scala>:load/usr/local/scala/mycode/Counter2.scalaLoading/usr/local/scala/mycode/Counter2.scala…definedclassCounterscala>valc1=newCounterthemainconstructorc1:Counter=Counter@319c6b2
scala>valc2=newCounter("the2ndCounter")themainconstructorthefirstauxiliaryconstructor,name:the2ndCounterc2:Counter=Counter@4ed6c602
scala>valc3=newCounter("the3rdCounter",2)themainconstructorthefirstauxiliaryconstructor,name:the3rdCounterthesecondauxiliaryconstructor,name:the3rdCounter,step:2c3:Counter=Counter@64fab83b2.3.1類2.3.2對象單例對象apply方法update方法unapply方法2.3.2對象同樣的功能Java靜態(tài)成員單例對象(singletonobject)2.3.2對象單例對象:使用object關(guān)鍵字定義單例對象//代碼文件為/usr/local/scala/mycode/Person.scalaobjectPerson{privatevarlastId=0//一個人的身份編號defnewPersonId()={lastId+=1lastId}}2.3.2對象單例對象:單例對象的使用與一個普通的類實例一樣//代碼文件為/usr/local/scala/mycode/Person.scalaobjectPerson{privatevarlastId=0//一個人的身份編號defnewPersonId()={lastId+=1lastId}}2.3.2對象單例對象:單例對象的使用與一個普通的類實例一樣scala>:load/usr/local/scala/mycode/Person.scalaLoading/usr/local/scala/mycode/Person.scala…definedobjectPersonscala>printf("Thefirstpersonid:%d.\n",Person.newPersonId())Thefirstpersonid:1.scala>printf("Thesecondpersonid:%d.\n",Person.newPersonId())Thesecondpersonid:2.scala>printf("Thethirdpersonid:%d.\n",Person.newPersonId())Thethirdpersonid:3.2.3.2對象伴生對象孤立對象單例對象2.3.2對象單例對象同名類的伴生對象同名類單例對象的伴生類互為伴生關(guān)系2.3.2對象類伴生對象互相訪問對方內(nèi)部的成員變量和成員方
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026湖州市事業(yè)單位招聘緊缺人才80人參考筆試題庫附答案解析
- 康養(yǎng)醫(yī)養(yǎng)中心客戶滿意度提升方案
- 2026年甘肅省天水市引進高層次和急需緊缺人才219人參考考試題庫及答案解析
- 唯品會營銷主管招聘秘籍及題目預(yù)測
- 供水管網(wǎng)及智慧水務(wù)系統(tǒng)工程項目運營管理方案
- 電信經(jīng)理面試題及答案解析
- 化妝品行業(yè)市場銷售專員面試題目與答案
- 2025廣東財經(jīng)大學(xué)第二次招聘合同制人員(司機崗位)1人備考筆試試題及答案解析
- 現(xiàn)代咨詢方法與實務(wù)客戶需求深度挖掘
- 電商運營經(jīng)理面試題庫及解答參考
- GB 42301-2022口岸公共衛(wèi)生核心能力建設(shè)技術(shù)規(guī)范
- 第15課《誡子書》知識點梳理語文七年級上冊
- 萬物皆有歡喜時李漢榮散文集
- 顱頜面骨異常整形術(shù)后護理查房
- 兒童繪畫與心理治療課件
- 特種設(shè)備安全管理培訓(xùn)(培訓(xùn)材料)課件
- 流程設(shè)計與優(yōu)化培訓(xùn)課件
- 《鄉(xiāng)土中國》讀書分享讀書感悟讀后感圖文課件
- 高位截癱患者的麻醉演示文稿
- ICU抗生素使用課件
- 【語文】高考60篇古詩文全項訓(xùn)練寶典
評論
0/150
提交評論