国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

有趣的 Scala 語言:簡潔的 Scala 語法

開發(fā) 后端
搭建Scala 開發(fā)環(huán)境,一是在IntelliJ IDEA 上安裝Scala 插件和安裝Scala SDK,二是通過Scala RELP(Read-Eval-Print Loop)交互式環(huán)境,該交互式環(huán)境適合代碼簡單調(diào)試,不太適合進行應(yīng)用開發(fā)。

一、Scala開發(fā)環(huán)境

搭建Scala 開發(fā)環(huán)境,一是在IntelliJ IDEA 上安裝Scala 插件和安裝Scala SDK,二是通過Scala RELP(Read-Eval-Print Loop)交互式環(huán)境,該交互式環(huán)境適合代碼簡單調(diào)試,不太適合進行應(yīng)用開發(fā)。

二、變量和函數(shù)

定義變量時沒有指定變量類型。這是否意味著 Scala 是和 Python 或者 Ruby 一樣的動態(tài)類型語言呢?恰恰相反,Scala 是嚴(yán)格意義上的靜態(tài)類型語言,由于其采用了先進的類型推斷(Type Inference)技術(shù),程序員不需要在寫程序時顯式指定類型,編譯器會根據(jù)上下文推斷出類型信息。比如變量 x被賦值為 0,0 是一個整型,所以 x的類型被推斷出為整型。當(dāng)然,Scala 語言也允許顯示指定類型,如變量 x1,y1的定義。一般情況下,我們應(yīng)盡量使用 Scala 提供的類型推斷系統(tǒng)使代碼看上去更加簡潔。

另一個發(fā)現(xiàn)是程序語句結(jié)尾沒有分號,這也是 Scala 中約定俗成的編程習(xí)慣。大多數(shù)情況下分號都是可省的,如果你需要將兩條語句寫在同一行,則需要用分號分開它們。

函數(shù)的定義也非常簡單,使用關(guān)鍵字 def,后跟函數(shù)名和參數(shù)列表,如果不是遞歸函數(shù)可以選擇省略函數(shù)返回類型。Scala 還支持定義匿名函數(shù),匿名函數(shù)由參數(shù)列表,箭頭連接符和函數(shù)體組成。函數(shù)在 Scala 中屬于一級對象,它可以作為參數(shù)傳遞給其他函數(shù),可以作為另一個函數(shù)的返回值,或者賦給一個變量。在下面的示例代碼中,定義的匿名函數(shù)被賦給變量 cube。匿名函數(shù)使用起來非常方便,比如 List對象中的一些方法需要傳入一個簡單的函數(shù)作為參數(shù),我們當(dāng)然可以定義一個函數(shù),然后再傳給 List對象中的方法,但使用匿名函數(shù),程序看上去更加簡潔。

  1. // 定義函數(shù)  
  2. def square(x: Int): Int = x * x  
  3. // 如果不是遞歸函數(shù),函數(shù)返回類型可省略  
  4. def sum_of_square(x: Int, y: Int) = square(x) + square(y)  
  5. sum_of_square(2, 3) 

 有趣的 Scala 語言:簡潔的 Scala 語法

  1. // 定義匿名函數(shù)  
  2. val cube = (x: Int) => x * x *x  
  3. cube(3)  
  4. // 使用匿名函數(shù),返回列表中的正數(shù)  
  5. List(-2, -1, 0, 1, 2, 3).filter(x => x > 0) 

 有趣的 Scala 語言:簡潔的 Scala 語法

讓我們再來和 Java 中對應(yīng)的函數(shù)定義語法比較一下。首先,函數(shù)體沒有像 Java 那樣放在 {}里。Scala 中的一條語句其實是一個表達式,函數(shù)的執(zhí)行過程就是對函數(shù)體內(nèi)的表達式的求值過程,最后一條表達式的值就是函數(shù)的返回值。如果函數(shù)體只包含一條表達式,則可以省略 {}。其次,沒有顯示的 return語句,最后一條表達式的值會自動返回給函數(shù)的調(diào)用者。

和 Java 不同,在 Scala 中,函數(shù)內(nèi)部還可以定義其他函數(shù)。比如上面的程序中,如果用戶只對 sum_of_square 函數(shù)感興趣,則我們可以將 square 函數(shù)定義為內(nèi)部函數(shù),實現(xiàn)細節(jié)的隱藏。

定義內(nèi)部函數(shù): 

有趣的 Scala 語言:簡潔的 Scala 語法

三、流程控制語句

復(fù)雜一點的程序離不開流程控制語句,Scala 提供了用于條件判斷的 if else和表示循環(huán)的 while。和 Java 中對應(yīng)的條件判斷語句不同,Scala 中的 if else是一個表達式,根據(jù)條件的不同返回相應(yīng)分支上的值。比如下面例子中求絕對值的程序,由于 Scala 中的 if else是一個表達式,所以不用像 Java 那樣顯式使用 return返回相應(yīng)的值。

使用 if else 表達式:

  1. def abs(n: Int): Int = if (n > 0) n else -n 

 有趣的 Scala 語言:簡潔的 Scala 語法

和 Java 一樣,Scala 提供了用于循環(huán)的 while 語句,在下面的例子中,我們將借助 while 循環(huán)為整數(shù)列表求和。

使用 while 為列表求和:

  1. def sum(xs: List[Int]) = {  
  2. var total = 0  
  3. var index = 0  
  4. while (index < xs.size) {  
  5. total += xs(index 
  6. index += 1  
  7.  
  8. total  

 有趣的 Scala 語言:簡潔的 Scala 語法

上述程序是習(xí)慣了 Java 或 C++ 的程序員想到的第一方案,但仔細觀察會發(fā)現(xiàn)有幾個問題:首先,使用了 var定義變量,我們在前面說過,盡量避免使用 var。其次,這個程序太長了,第一次拿到這個程序的人需要對著程序仔細端詳一會:程序首先定義了兩個變量,并將其初始化為 0,然后在 index小于列表長度時執(zhí)行循環(huán),在循環(huán)體中,累加列表中的元素,并將 index加 1,最后返回最終的累加值。直到這時,這個人才意識到這個程序是對一個數(shù)列求和。

讓我們換個角度,嘗試用遞歸的方式去思考這個問題,對一個數(shù)列的求和問題可以簡化為該數(shù)列的第一個元素加上由后續(xù)元素組成的數(shù)列的和,依此類推,直到后續(xù)元素組成的數(shù)列為空返回 0。具體程序如下,使用遞歸,原來需要 9 行實現(xiàn)的程序現(xiàn)在只需要兩行,而且程序邏輯看起來更清晰,更易懂。

使用遞歸對數(shù)列求和:

  1. //xs.head 返回列表里的頭元素,即第一個元素  
  2. //xs.tail 返回除頭元素外的剩余元素組成的列表  
  3. def sum1(xs: List[Int]): Int = if (xs.isEmpty) 0 else xs.head + sum1(xs.tail) 

有沒有更簡便的方式呢?答案是肯定的,我們可以使用列表內(nèi)置的一些方法達到同樣的效果: 

有趣的 Scala 語言:簡潔的 Scala 語法

上述使用了規(guī)約操作。

規(guī)約操作是對容器的元素進行兩兩運算,將其規(guī)約為一個值。最常見的規(guī)約方式使 reduce,它接受一個二元函數(shù) f 作為參數(shù),首先將 f 作用在某兩個元素上并返回一個值,然后再將 f 作用在上一個返回值和容器的下一個元素上,再返回一個值,依次類推,最后容器中的所有值會被規(guī)約為一個值。

  1. list map (_.toString) reduce((x,y)=>s"f($x,$y)"

 有趣的 Scala 語言:簡潔的 Scala 語法

上面這行代碼:先通過 map 操作將List[Int] 轉(zhuǎn)化成 List[String],也就是把列表中的每個元素從 Int 類型轉(zhuǎn)換成 String 類型,然后對這個字符串進行自定義規(guī)約,語句的執(zhí)行結(jié)果清楚地展示了 reduce的過程。

事實上,List 已經(jīng)為我們提供了 sum 方法,在實際應(yīng)用中,我們應(yīng)該使用該方法,而不是自己定義一個。作者只是希望通過上述例子,讓大家意識到 Scala 雖然提供了用于循環(huán)的 while 語句,但大多數(shù)情況下,我們有其他更簡便的方式能夠達到同樣的效果。 

有趣的 Scala 語言:簡潔的 Scala 語法

四、如何運行 Scala 程序?

在運行方式上,Scala 又一次體現(xiàn)出了它的靈活性。它可以被當(dāng)作一種腳本語言執(zhí)行,也可以像 Java 一樣,作為應(yīng)用程序執(zhí)行。

作為腳本執(zhí)行:

  • 我們可以將 Scala 表達式寫在一個文件里,比如 Hello.scala。在命令行中直接輸入 scala Hello.scala就可得到程序運行結(jié)果。

Hello.scala 代碼:

  1. println("Hello Rickie!"

 有趣的 Scala 語言:簡潔的 Scala 語法

作為應(yīng)用程序執(zhí)行:

作為應(yīng)用程序執(zhí)行時,我們需要在一個單例對象中定義入口函數(shù) main,經(jīng)過編譯后就可以執(zhí)行該應(yīng)用程序了。

  1. object HelloRickie {  
  2. def main(args: Array[String]): Unit = {  
  3. println("Hello Rickie!" 
  4.  

 有趣的 Scala 語言:簡潔的 Scala 語法

Scala 還提供了一個更簡便的方式,直接繼承另一個對象 App,無需定義 main方法,編譯即可運行。 

有趣的 Scala 語言:簡潔的 Scala 語法

五、結(jié)束語

本文為大家介紹了 Scala 的基本語法,相比 Java,Scala 的語法更加簡潔,比如 Scala 的類型推斷可以省略程序中絕大多數(shù)的類型聲明,短小精悍的匿名函數(shù)可以方便的在函數(shù)之間傳遞,還有各種在 Scala 社區(qū)約定俗成的習(xí)慣,比如省略的分號以及函數(shù)體只有一條表達式時的花括號,這一切都幫助程序員寫出更簡潔,更優(yōu)雅的程序。

 

責(zé)任編輯:未麗燕 來源: 今日頭條
相關(guān)推薦

2010-08-18 08:53:53

Scala

2009-07-08 12:43:59

Scala ServlScala語言

2013-08-20 09:23:06

Scala遞歸

2009-06-16 17:54:38

Scala類語法語義

2023-10-14 17:21:53

Scala編程

2010-09-14 15:34:41

Scala

2009-12-11 10:44:00

Scala講座函數(shù) scala

2009-07-08 14:51:10

2009-07-08 16:42:57

Scala語言設(shè)計

2009-08-06 14:01:53

Scala的優(yōu)點

2009-11-16 17:04:46

Inside Scal

2010-09-14 13:22:17

Scala編程指南Scala

2009-02-06 09:08:04

Scala函數(shù)語言輕量級

2009-12-09 09:15:47

從Java走進ScalTwitter API

2009-07-22 07:41:00

Scala函數(shù)文本占位符語法

2009-10-19 11:26:08

Scala循環(huán)數(shù)組

2009-09-02 17:56:31

ScalaWeb 2.0

2021-07-09 06:48:30

語言Scala編程

2020-12-29 06:44:18

GoScala編程語言

2009-09-28 11:01:39

從Java走進Scal
點贊
收藏

51CTO技術(shù)棧公眾號

成人狠狠色综合| 国产精品日韩欧美一区二区三区| 欧洲亚洲国产日韩| 亚洲欧美另类小说| 国产91成人在在线播放| 日本免费视频| 亚洲性色视频| 日韩电影网在线| 黄色一级一级片| 久久社区一区| 免费国产a级片| 亚洲爆乳无码专区| 国产一区网站| 成人a在线观看高清电影| 中文在线天堂库| 在线毛片观看| 日本一区二区在线看| 91精品国产丝袜白色高跟鞋| 一卡二卡三卡视频| 久久久国产精品入口麻豆| 亚洲在线一区| 成人免费观看av| 亚洲欧美激情四射在线日| 国产精品高潮在线| 久久综合九色综合久99| 97视频在线免费播放| 欧美日韩国产免费观看| 精品少妇一区二区| 91精品无人成人www| 欧美日韩a区| 国产精品推荐精品| 欧美aaa在线| 8x拔播拔播x8国产精品| 国产调教视频在线观看| 国产精品视频一二三区| 品久久久久久久久久96高清| 卡通动漫精品一区二区三区| 欧美一区二区三区在线视频 | 日韩av大全| 亚洲不卡视频| 欧美日本一区二区| 四虎永久在线精品无码视频| 中文字幕一区二区三区在线播放 | 国产日产精品一区二区三区四区的观看方式| 国产精品爱久久久久久久| 亚洲精品tv久久久久久久久久| xvideos国产精品| 黄色大片在线看| 国产精品三级在线观看| h网站在线播放| 久久久777精品电影网影网| 欧洲精品码一区二区三区免费看| 性欧美亚洲xxxx乳在线观看| 毛片在线播放网址| 97久久精品人人澡人人爽| 久久精品美女| 99视频精品全部免费在线视频| 欧美国产高跟鞋裸体秀xxxhd| 欧美日韩国产观看视频| 一区二区三区www| 视频一区视频二区视频三区视频四区国产 | 国产精品亚洲成人| 日韩福利在线播放| 三级欧美在线一区| 97久久国产精品| 欧美超碰在线| 中文字幕日韩一区二区三区不卡| 亚洲高清电影| 蜜臀久久99精品久久久久久宅男| 国产精品高颜值在线观看| 日韩欧美综合在线视频| 国外av网站| 欧美国产亚洲另类动漫| 91超碰在线电影| 99久精品视频在线观看视频| 一级一片免费播放| 先锋影音久久久| 高清成人av| 国产丝袜一区二区三区| 中文不卡1区2区3区| 国产精品永久免费视频| 成人三级视频| 国产精品福利小视频| 蜜臂av日日欢夜夜爽一区| wwwav91com| 亚洲综合在线五月| 亚洲综合欧美激情| 久久久国产午夜精品| 麻豆视频免费在线观看| 欧美日韩国产综合视频在线观看| 视频精品一区二区三区| 香蕉久久免费影视| 日韩欧美视频一区二区三区| 亚洲性无码av在线| 羞羞视频在线观看免费| 国产精品欧美久久久久无广告| www午夜视频| 亚洲视频在线观看三级| 91视频国产精品| 亚洲区小说区图片区qvod按摩| 欧美激情videos| 亚洲色图另类专区| 日韩精选视频| caoporn成人| 99在线视频影院| 欧美成va人片在线观看| 欧美激情第1页| 欧美一级欧美一级在线播放| 专区另类欧美日韩| 久久精品影视大全| 日韩av在线网址| 亚洲理论在线| 男女污污视频在线观看| 国产精品揄拍一区二区| 中文字幕一区在线| 人人精品久久| 国产成人精品在线| 亚洲女同另类| 精品国产免费久久久久久尖叫| 成人频在线观看| 成人av影视| 精品视频免费在线播放| 欧美日韩综合网| 日本成人在线免费视频| 7777精品伊人久久久大香线蕉| 国产精品日韩精品| 国内精品福利| 欧美激情论坛| 欧美日韩亚洲另类| а√天堂8资源在线| 欧美区高清在线| 日韩一区和二区| 美女视频黄 久久| 日本高清成人vr专区| 九九热在线精品视频| 欧美一区二区三区另类| 宅男噜噜99国产精品观看免费| 欧美日韩一区视频| 一本色道久久综合亚洲精品高清| 国产97在线 | 亚洲| 亚洲人成在线播放网站岛国| 激情av综合| 日本一二区视频| 亚洲欧美在线一区| jizzjizz欧美69巨大| 午夜免费电影一区在线观看| 亚洲激情 国产| 激情婷婷综合| 四虎精品成人影院观看地址| 中文字幕亚洲一区在线观看| 欧美日韩精品| 91精品久久| 国产精品久久久久久久久久小说 | 欧美与欧洲交xxxx免费观看| 又紧又大又爽精品一区二区| h片在线观看视频免费免费| 五月天在线免费视频| 亚洲成av人片一区二区| 精品欧美日韩精品| 91久色国产| 日韩一区二区免费电影| 国产高清一区日本| 中文字幕在线视频不卡| 欧美另类交人妖| 日本aⅴ免费视频一区二区三区 | 欧日韩在线观看| 538视频在线| 欧美黄网在线观看| 欧美亚日韩国产aⅴ精品中极品| 成人综合日日夜夜| 鲁鲁视频www一区二区| 亚洲国产免费av| 国产欧美日韩一区二区三区在线观看| 成人一级毛片| freexxx性亚洲精品| 色爱综合网站| 色综合男人天堂| 久久综合亚洲| 欧美欧美黄在线二区| 女生裸体视频一区二区三区| 波多野一区二区| 久久6免费高清热精品| 午夜在线成人av| 久久99精品久久只有精品| h精品动漫在线观看| 欧美一区三区二区在线观看| 欧美日韩xxx| 欧美亚洲国产一区在线观看网站| 国产电影一区二区三区| 欧美亚洲国产一区| 天堂中文av在线资源库| 女生裸体视频网站免费观看| 伊人色综合影院| 国产在线观看一区二区三区| 国产精品久久久久久久第一福利| 欧美日一区二区在线观看 | 午夜久久久久久久久久久| 国产成人亚洲综合91精品| 亚洲男人的天堂在线| 午夜日韩在线电影|