標籤:

起航~~~初見Scala

一直以來,雜亂無章的學了很多大數據的知識。因不善於寫作,鮮有歸納和分享所學。總想寫些東西和眾IT業知友交流,並希望向業界大牛學習。

從哪裡開始呢?從開發語言吧!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

編譯HelloWorld.scala

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

Good Job!代碼更加精簡了。

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不可以被繼承。classtrait可以相互繼承或實現,但class只能繼承單獨的一個,而trait可以繼承或實現多個。

變數定義

Scala有兩種變數,valvar。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並不支持breakcontinue 關鍵字。可以通過修改代碼結構來避免breakcontinue。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的自我修養:神秘的首席數據官究竟有哪些操作

TAG:大数据 | Scala |