起航~~~初見Scala
從哪裡開始呢?從開發語言吧!Scala
Scala是一門現代的多範式編程語言,志在以簡練、優雅及類型安全的方式來表達常用編程模式。它平滑的集成了面向對象和函數語言的特性。Scala很容易上手。它運行於標準的Java平台上,可以與所有的Java庫無縫交互。Scala語言的名稱來自於「可伸展的語言」。之所以這樣命名,是因為它被設計成可以隨著使用者的需求而擴展。Scala的應用範圍很廣,從編寫簡單的腳本,到建立獨立的大型系統。
馬丁·奧德斯基是EPFL(洛桑聯邦理工學院)編程研究組的教授。他在整個職業生涯中一直不斷追求著一個目標:讓寫程序這樣一個基礎工作變得高效、簡單、且令人愉悅。他可能比世界上任何一個人寫過更多的Java和Scala代碼。他編寫了javac,這是目前大部分Java程序員所使用的編譯器。他也編寫了Scala編譯器scalac,可謂是Scala社區飛速發展的基石。他曾經就職於IBM研究院、耶魯大學、卡爾斯魯厄大學以及南澳大利亞大學。在此之前,他在瑞士蘇黎世聯邦理工學院追隨Pascal創始人Niklaus Wirth學習,並於1989年獲得博士學位。
2001 年,馬丁·奧德斯基開始設計 Scala。Java 平台的Scala 於 2003 年底發布。.NET 平台的 Scala 發佈於 2004 年 6 月。該語言第二個版本v2.0,發佈於 2006 年 3 月。目前,最新的scala版本是2.12.1。官網地址: The Scala Programming Language 。
首先,再官網上下載對應OS的Scala SDK,安裝後配置環境變數。
Unix
$SCALA_HOME/usr/local/share/scala n$PATH=$PATH:$SCALA_HOME/binn
Windows
%SCALA_HOME%c:Program FilesScala n%SCALA_HOME%binn
打開命令行終端,執行以下命令
scala -versionn
出現以下內容即可
#Scala code runner version 2.11.8 -- Copyright 2002-2016, LAMP/EPFLn
各種開發語言大抵是從"Hello World"開始,那我們也遵從這個潛規則吧。:)
新建HelloWorld.scala 文件,添加以下內容
object HelloWorld {n def main(args: Array[String]): Unit = {n println("Hello, world!")n }n}n
scalac HelloWorld.scalan
scalac 命令會把Scala源文件編譯生成Java .class 文件。.class文件可以運行在任何的標準JVM中。
運行Helloworld
scala HelloWorldn
屏幕上會顯示
Hello, world!n
Well!
那麼,用Scala的App trait ,再改進一下代碼。
object HelloWorld extends App {n println("Hello, world!")n}n
Scala除了可以開發大型應用系統外,也可以被用作腳本語言使用。
新建HelloWorld.sh 文件
#!/usr/bin/env scalannobject HelloWorld extends App {n println("Hello, world!")n}nHelloWorld.main(args)n
然後,執行它
./script.shn
OK!Hello World 結束了。我從Scala的基本類型和概念,進一步的了解Scala語言。
基本類型
Bytet8位有符號值。範圍從-128到127
Short16位有符號值。範圍從-32768至32767
Int32 位有符號值。範圍從 -2147483648 to 2147483647
Long64位有符號值。 從-9223372036854775808到9223372036854775807
Float32位IEEE754單精度浮點數
Double64位IEEE754雙精度浮點數
Char16位無符號Unicode字元。範圍由U+0000至U+FFFF
String字元序列
Booleanttrue或false
Unit對應於沒有值
Null空或空引用
Nothing每一個其他類型的子類型; 包括無值
AnytAny類型的超類型;任何對象是任何類型
AnyRef任何引用類型的超類型
其中Byte、Short、Int、Long、Float、Double、Chart、Boolean是值類型。與Java不同的是Scala並不區分原始類型和封裝類型,一律是首字母大寫。
//Rightnval i:Int=0n//Wrongnval i:int=0n
String是直接引用的java.long.String,Unit 類似java 中的void。Null是所有AnyRef的子類,Nothing是所有類型的子類,也是Null的子類。Any是abstract類,它是Scala類繼承結構中最底層的。所有運行環境中的Scala類都是直接或間接繼承自Any這個類,類似就是Java中的Object。AnyRef是所有引用類型的父類。除了值類型,所有類型都繼承自AnyRef。
基本概念
class => 與Java相同,class是一個可以在運行期被實例化成許多對象的靜態代碼模板。
class Point(var x: Int, var y: Int) {n def move(dx: Int, dy: Int): Unit = {n x = x + dxn y = y + dyn }n override def toString: String = "(" + x + ", " + y + ")"n}n
object => 是單實例的class
object Classes {n def main(args: Array[String]) {n val pt = new Point(1, 2)n println(pt)n pt.move(10, 10)n println(pt)n }n}n
trait => 類似Java中的interface,不同的是,trait可以定義一些有實現的方法。
trait Similarity {n def isSimilar(x: Any): Booleann def isNotSimilar(x: Any): Boolean = !isSimilar(x)n}n
object 可以繼承或實現class和trait,但object不可以被繼承。class和trait可以相互繼承或實現,但class只能繼承單獨的一個,而trait可以繼承或實現多個。
變數定義
Scala有兩種變數,val和var。val類似Java中的final變數。一旦初始化了,就不能再次賦值。與之相反,var可以在生命周期中多次賦值。
val massage="Hello World!"n
與Java語法上不同的是,首先標明val關鍵字,然後是變數名稱。Scala有強大的類型推斷能力,如非必要不必標註變數類型。標註類型參照以下
val massage:String = "Hello World!"n
此外,scala還提供了一種懶載入關鍵字lazy,使變數在使用時才初始化
def init(): Int = {n100n}nlazy val hundred = init()n
函數定義
def sayHello():String={n"Hello World!"n}n
函數定義是以 def 關鍵字開始,然後是函數名sayHello,緊跟返回值類型:String。而{...} 中是方法體。與Java不同的是,Scala規定有效最後代碼一行,即是返回語句,不需要顯式標明return關鍵字。
程序控制結構
var i=0nif(i<=0){n print("Yes , Im equal or less than Zero.")n}n------------------------------------nvar i = 0nwhile (i <= 0) {n i += 1n print("Yes , Im equal or less than Zero.")n}n------------------------------------nvar i = 0ndo {n i += 1n print("Yes , Im equal or less than Zero.")n} while (i <= 0)n
需要給予注意的是,為了使語法更加簡潔和易讀(與函數字面量嚙合的不好)Scala並不支持break和continue 關鍵字。可以通過修改代碼結構來避免break和continue。2.8版本以後可以使用工具類來實現break。
import scala.util.control.Breaks.{break, breakable}nval arr = Array(1, 2, 3)nbreakable {nfor (i <- arr) {nif (i >= 2) break()nprint(i)n }n}n
遍曆數組
var arr = Array(1,2,3)nfor(i<- arr){nprintln(s"Im $i")n}n
Scala的基本概念先介紹這麼多,在以後的章節中會深入的介紹Scala。
本章里走馬觀花的介紹了一些基本的概念和語法,相信大家會發現Scala是一門非常有趣的語言,它既支持面向對象的編程方式,又支持函數式編程。筆者之前經歷過很多開發語言,從未感到編程的有趣。直到接觸Scala,發現原來枯燥的編程可以如此美好。希望能通過Scala這個系列為大家帶來一些清新的氣息。
推薦閱讀:
※Windows 的觸控板沒用?我教你這樣用好它|有用功
※第4講:複雜數據處理與分析
※基本粒子路馳:新零售的核心是基於數字化的連接
※大數據那些事(18):DoNotEvil公司的程序猿味
※論一個CDO的自我修養:神秘的首席數據官究竟有哪些操作