亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Scala函數式編程專題--scala基礎語法介紹

 更新時間:2020年06月29日 10:38:39   作者:zzzzMing  
這篇文章主要介紹了scala基礎語法的的相關資料,文中講解非常詳細,幫助大家更好的理解和學習,感興趣的朋友可以了解下

上次我們介紹了函數式編程的好處,并使用scala寫了一個小小的例子幫助大家理解,從這里開始我將真正開始介紹scala編程的一些內容。

這里會先重點介紹scala的一些語法。當然,這里是假設你有一些java或者python的基礎,畢竟大部分人不會將scala當作第一門學習編程的語言。

不過這些語法知識記不住也沒關系,本身語法這種東西就應該在使用中被記住。這里寫這篇的目的也只是梳理一遍,方便大家對語法有個初步的印象,后面可以隨時查詢。

PS:所使用的版本是scala 2.11.8,那我們開始吧

一.scala兩種運行方式

首先,scala有兩種運行方式,分別是在交互式環(huán)境運行,以及通過腳本的方式運行。先運行一下吧,在scala安裝目錄下有一個bin文件夾,在這個文件夾雙擊scala.bat(Windows系統),就可以啟動scala交互環(huán)境。當然,一般在安裝scala,都會將“scala目錄/bin”加入到系統的Path變量中,這個時候直接運行cmd,然后輸入scala就可以了。

因為scala也是運行在jvm平臺上的,所以用腳本方式的話,類似于java那樣,需要先編譯再執(zhí)行。但是一般我們都會使用IDE來處理。通過我個人是更加喜歡idea的,只要下載免費的社區(qū)版就可以滿足日常開發(fā)需求。

二.scala變量和類型

2.1 變量

首先,我們先來用一個例子來看看具體語法。在交互式環(huán)境中輸出hello world。

//聲明一個字符串
scala> val str = "Hello world"
str: String = Hello world

//打印
scala> println(str)
Hello world

相信大家看一眼就能明白這兩行代碼是干嘛的,那我就說一點看不出來的。

scala聲明一個變量可以用val和var。val意為這個變量是不可變的,var意為這個變量是可變的。

scala> val num = 1; //聲明一個不可變的數值型變量
num: Int = 1

scala> num = 2	//因為不可變,所以要更改時,出錯了
<console>:12: error: reassignment to val
  num = 2
   ^

scala> var num_var = 1; //聲明一個可變的數值型變量
num_var: Int = 1

scala> num_var = 2;	//可以改變
num_var: Int = 2

從功能上來說,類似于java的final關鍵字。而且scala語言傾向于讓你多使用val,而少用var。

為什么呢?

因為能夠更方便得使用并發(fā),在java的并發(fā)編程中,最喜歡的就是final的變量,因為它都是不變的,隨便怎么用就怎么用。而scala所支持的函數式編程,天然就適合異步和并發(fā),所以做了這樣的處理,包括scala的集合類,默認也是不可變的類型,如果要使用可變的集合,需要手動指定。

2.2 scala數據類型

說完了變量,再來說說scala的數據類型。這里直接上一張圖。

這張圖說明了scala的數據類型繼承關系,我們先看最上面的Any類型,Any類型是所有數據類型的爸爸,在它里面定義了equals,toString這些方法,類似于java的object。這一點和java還是比較類似的。

然后接著往下看,Any又有兩個字類,左邊的AnyVal以及右邊的AnyRef。右邊的先不管,那個主要是集合那邊的知識,我們只看左邊的。

AnyVal又被多個數據類型繼承,這些就是日常常用的一些數據類型了,可以看到和Java類似,都是Int,Double,Long這些。對了,這些數據類型,Int,Double,Long什么的,都是類,不像java,還有分int和Integer。

最后再來看看最下面的Nothing和Null吧,把這倆貨擱在一塊說是因為這幾個概念非常容易混淆,我自己要用的時候還得去查清楚了。

  • java的null(scala也可以用,不過n是小寫):就是代表沒有任何東西,即空。一般新建一個對象,默認值就是這貨。
  • scala的Nothing:所有數據類型的子類,沒有具體的值可以對應到這種類型,也就是說你沒法為Nothing類型賦值,包括null也不行。那可能有的小伙伴就會問了,那要這個玩意干嘛呢?一般嘛,try catch的返回值就是這種類型,還有程序exit的時候也是返回它,大概就是在不需要返回值的時候,就返回這個意思意思。
  • scala的Null(注意大小寫):是所有集合類的子類,這種類型只能使用null來賦值,可以說基本沒什么卵用。只要知道有這么個東西就行。

三.scala面向對象編程

是的,你沒看錯,雖然這里是用scala來進行函數式編程,但scala也同樣提供了OOP的能力,后面有很大的概率也會說到,我們就順帶著簡單介紹一下吧。

還是和java中的概念類似,只不過名字稍稍有些變化。對應過來大概是這樣的:

  • java的interface -> scala的trait (其實trait更類似abstract class)
  • java的abstract class -> 一樣是abstract class
  • java的class -> scala的class和object(關于class和object的區(qū)別,會在后面說)

其中,雖然說java的接口對應的是scala的trait,但trait這個東西其實和interface還是有很多不一樣的,比如可以定義變量,可以直接定義方法內容等。當然,沒有構造器和無法接收參數這個還是不變滴。

trait Car {
 val brand: String
}

trait Shiny {
 val shineRefraction: Int
}
class BMW extends Car {
 val brand = "BMW"
}
//通過with關鍵字,一個類可以擴展多個特質:

class BMW extends Car with Shiny {
 val brand = "BMW"
 val shineRefraction = 12
}

接下來重點說說class和object。

在scala中,是沒有static這個關鍵字的,那么這樣一來,很多java的功能就都沒法實現,比如靜態(tài)方法,或者是單例模式,或者是沒有main方法。這個時候,object就出現了。

每個class都可以有一個同名的object,這個object被稱之為伴生對象(companion class)。class和object可以互相訪問對方的私有成員(public,private這些權限訪問和java是一樣的)。

class Json{
 
}
object Json {
 def toJsonObject(str:String):Unit = {
 
 }
 var a = 1
 def main(args:Array[String]):Unit = {
 val json = Json
 json.toJsonObject("......") //不需要new對象,直接使用toJsonObject方法。

 }
}

得益于object,我們可以像調用java靜態(tài)方法一樣地寫scala代碼,而這一切,都要歸功于object。

因為!object里面的變量,或是方法,都是static的,這里說的static是方便有java基礎的童鞋理解,scala是沒有static這一個關鍵字的。如果要使用單例,那更簡單,直接定義一個object就行了。

object Timer {
 var count = 0

 def currentCount(): Long = {
 count += 1
 count
 }
}
可以這樣使用:

scala> Timer.currentCount()
res0: Long = 1

接下來說個比較常用的語法糖吧,那就是object的apply方法。當一個類只有一個用途的時候,就可以用它。

scala> class Foo {}
defined class Foo

//有一個apply方法
scala> object FooMaker {
  | def apply() = new Foo
  | }
defined module FooMaker

//新建object,自動得就調用了apply
scala> val newFoo = FooMaker() //賦值的對象是Foo,因為調用了FooMaker()的apply 
newFoo: Foo = Foo@5b83f762 

看上面的代碼,object是不用new出來而可以直接就用的。而用的時候,其實就默認調用了這個object的apply方法。

有沒有覺得很熟悉,這其實就是工廠模式。

OK,這些就是scala里面,有關面向對象的一些基礎知識,當然還有更高階的,比如集合和多態(tài),這些后面用到的時候再說吧。

結語

本次介紹了scala的基礎變量和類型,scala默認是更加推薦使用不可變的變量,而常見的數據類型和java基本差不多,只是名字和用法上有些差別。

而在面向對象這一塊上,也基本和java差不多,只要有java的基礎,熟悉這部分的語法應該不是問題。

那么按我的理解來說說為什么scala會有這些改動吧。首先,scala是在java發(fā)明后才被創(chuàng)建出來的,其設計理念必然會比java成熟一些,所以也就會想解決一些java的缺陷,比如說java某些語法較為冗余。而scala則較為靈活一些,比如多了object,不需要每次都new一個對象,再比如有交互式環(huán)境。

其次,scala也是為了貼近于函數式編程,函數式的核心,就是編寫無副作用代碼。而更本質地說,就是將代碼拆分模塊化,各個模塊各司其職,不是自己的別瞎動,自己管好自己的事,這個其實和微服務的思想是一樣的。

所以scala才會默認得讓變量是不可變的,就是為了盡量讓代碼保持不變。

OK,那今天就先說到這吧,下次再說scala語法的重頭戲,集合和函數。

以上就是scala函數式編專題——scala基礎語法介紹的詳細內容,更多關于scala函數式編程的資料請關注腳本之家其它相關文章!

相關文章

  • Scala函數式編程專題--scala集合和函數

    Scala函數式編程專題--scala集合和函數

    這篇文章主要介紹了scala集合和函數的的相關資料,文中示例代碼非常詳細,幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-06-06
  • 權限控制之粗粒度與細粒度概念及實現簡單介紹

    權限控制之粗粒度與細粒度概念及實現簡單介紹

    這篇文章主要介紹了權限控制之粗粒度與細粒度概念及實現簡單介紹,具有一定參考價值,需要的朋友可以了解下。
    2017-10-10
  • 8個基于Lucene的開源搜索引擎(推薦)

    8個基于Lucene的開源搜索引擎(推薦)

    Lucene是一種功能強大且被廣泛使用的搜索引擎,以下列出8種基于Lucene的搜索引擎,你可以想象他們有多么強大
    2017-04-04
  • 深入分析java與C#底層控制能力區(qū)別及示例詳解

    深入分析java與C#底層控制能力區(qū)別及示例詳解

    這篇文章主要為大家深入分析java與C#底層控制能力不同的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2021-11-11
  • 趣味函數式編程圣經

    趣味函數式編程圣經

    這篇文章主要介紹了函數式編程的的相關資料,有趣的講解了函數式編程的相關知識,幫助大家更好的理解學習,感興趣的朋友可以了解下
    2020-06-06
  • Spark在Win10下的環(huán)境搭建過程

    Spark在Win10下的環(huán)境搭建過程

    這篇文章主要介紹了Spark在Win10下的環(huán)境搭建過程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • Cordova插件實現JavaScript與Java的通信的詳細過程

    Cordova插件實現JavaScript與Java的通信的詳細過程

    本文將結合最常用的華為推送服務Cordova插件,介紹HMS Core用到的JS-Java消息交互方式,講解在JS側如何調用Java側接口,最終實現HMS Core能力,感興趣的朋友一起學習下吧
    2021-06-06
  • 匯編語言超濃縮教程

    匯編語言超濃縮教程

    對初學者而言,匯編的許多命令太復雜,往往學習很長時間也寫不出一個漂漂亮亮的程序,以致妨礙了我們學習匯編的興趣,不少人就此放棄
    2013-05-05
  • bilibili彈幕轉ass程序制作思路及過程

    bilibili彈幕轉ass程序制作思路及過程

    本文主要是為了方便線下播放Bilibili的彈幕,而專門制作的一款將彈幕轉換為ASS的程序,介紹了程序制作的思路及過程,有需要的朋友可以參考下
    2014-09-09
  • ffmpeg播放器實現詳解之視頻顯示(推薦)

    ffmpeg播放器實現詳解之視頻顯示(推薦)

    FFmpeg是一套可以用來記錄、轉換數字音頻、視頻,并能將其轉化為流的開源計算機程序。這篇文章主要介紹了ffmpeg播放器實現詳解視頻顯示,需要的朋友可以參考下
    2020-07-07

最新評論