日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯網營銷解決方案
Scala講座:函數、操作符及與Java的比較

本文節(jié)選自最近在日本十分流行的Scala講座系列的第三篇,由JavaEye的fineqtbull翻譯。本系列的作者牛尾剛在日本寫過不少有關Java和Ruby的書籍,相當受歡迎。

創(chuàng)新互聯專注為客戶提供全方位的互聯網綜合服務,包含不限于網站建設、成都網站制作、長垣網絡推廣、小程序設計、長垣網絡營銷、長垣企業(yè)策劃、長垣品牌公關、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務,您的肯定,是我們最大的嘉獎;創(chuàng)新互聯為所有大學生創(chuàng)業(yè)者提供長垣建站搭建服務,24小時服務熱線:18980820575,官方網址:www.cdcxhl.com

包和函數定義以及類型聲明

不過還是想把結婚這個動作明確表現出來呀,那就試著寫一下吧。對于函數式+面向對象的Scala來說有兩種考慮方式。

***個是面向對象的方法,當然就是讓Person類持有表示結婚的方法getMarriedTo(對方:Person)了。另一個就是函數式方法,結婚是那女雙方的事情,只在一方的Person類中定義getMarriedTo方法可能也不太確切,可以在Scala特有的單例對象中(object)定義marry方法來描述結婚這一事件。下面的例子中將Person類移到了Life包中,并在Life包中定義了同名的單例對象(singleton object),然后在Person類和對象中定義了getMarriedTo和marray方法。另外,因為這里的Person單例對象與Person類同名

且在同一個源文件里,所以他們互相又成為伴生對象和伴生類。

 
 
 
  1. package life {
  2. class Person(val firstName:String, val lastName:String, var spouse:Person) {
  3. def this(fn:String, ln:String) = this(fn, ln, null)
  4. def introduction = "我的名字是," + firstName + " " + lastName +
  5. (if (spouse != null) ",對方的名字是," + spouse.firstName + " " + spouse.lastName + "。" else "。")
  6. def getMarriedTo(p : Person) {
  7. this.spouse = p; p.spouse = this //姓可以在以后自由更改
  8. }
  9. override def toString : String = super.toString + " [姓: " + lastName + " 名: " + firstName + " 配偶: " +
  10. (if (spouse != null) " ("+ spouse.lastName + "," + spouse.firstName + ")" else "沒有") + "]"
  11. }
  12. object Person {
  13. def marry(p1: Person, p2: Person): Unit = {
  14. p1.spouse = p2; p2.spouse = p1 //姓可以在以后自由更改
  15. }
  16. }
  17. }

上述Unit類型代表不返回任何值,相當于Java中的void。如果想把Person類以別的名稱來使用則可以用import語句來聲明別名。比如以下程序中為Person類定義了名為Man的別名。

 
 
 
  1. scala> import life.{Person => Man}
  2. import life.{Person=>Man}

實際上述語句與以下聲明type別名的語句是一樣的

 
 
 
  1. scala> import life.Person
  2. import life.Person
  3. scala> type Man = Person
  4. defined type alias Man

正像這樣,我們可以利用Scala的交互式環(huán)境一邊寫簡潔的代碼一邊一點一點地確認結果來進行開發(fā)。還有,包和類都可以嵌套定義,這里就省略了。

Scala中操作符也是方法

實際上Scala并沒有內嵌在語言中的操作符。加法+、乘法*、減法-、除法/、字符串連接+和列表連接++等操作符都是Int、String或List等類型中的方法(有時可能是父類中的方法)。因此,操作符中的特殊字符在Scala中可以被用作方法名稱的一部分,這對于定義迷你語言(DSL,特定領域語言)來說是非常重要的。

那么,將“m先生和f女士結婚后f女士的姓變?yōu)閙”這一動作以“m < + f”來表示吧。在Scala中這

表示“對接受對象m適用方法< +,參數為f”,是“m.< +(f)”的簡化形式。馬上就在Person類中定義一個兩元操作符方法“< +”吧。雖然返回值也可以是Unit,這里就以接受對象自己為返回值吧。

 
 
 
  1. class Person … {
  2. def < +(p : Person): Person = { //姓與接受對象的姓相一致
  3. this.getMarriedTo(p) //和p結婚返回值為Unit
  4. p.lastName = this.lastName //改變姓,賦值表達式的返回值是Unit
  5. this //以接受對象自己作為返回值
  6. }
  7. }

下面的代碼是f嫁給了m,f的姓改為了m的姓了。

 
 
 
  1. scala> import life.Person
  2. import life.Person
  3. scala> val m = new Person("Fei", "Zhang")
  4. m: life.Person = life.Person@14683c0 [姓: Zhang 名: Fei 配偶: 沒有]
  5. scala> val f = new Person("Can", "Diao")
  6. f: life.Person = life.Person@863941 [姓: Diao 名: Can 配偶: 沒有]
  7. scala> m < + f
  8. res0: life.Person = life.Person@14683c0 [姓: Zhang 名: Fei 配偶: (Zhang,Can)]

到這里我們嘗試了一下兩元操作符,Scala也可以定義一元操作符,但不同的是方法名稱的格式為“unary_操作符”。

Java與Scala的混合

Scala可以非常方便的使用Java的類、接口以及其中定義的方法。不僅僅是調用方法,將Scala類定義為Java類或接口的子類或接口實現也是很容易的。還有,用scalac編譯Scala類后生成的僅僅是.class文件,完全可以毫無區(qū)別的把Java和Scala混在一起開發(fā)。

前面定義了life包,現在就定義一個單例對象Demo吧,在里面將嵌入使用Java的Swing庫的例子。將JFrame類在Demo中以Window為別名引入(import),然后就可以看看創(chuàng)建對象的樣子了。

 
 
 
  1. object Demo {
  2. import javax.swing.{JFrame=>Window}
  3. import javax.swing.JFrame._
  4. val mameWindow = new Window("window 1")
  5. mameWindow setSize(200, 150)
  6. mameWindow setDefaultCloseOperation(EXIT_ON_CLOSE)
  7. mameWindow setVisible(true)
  8. }

定義了該單例對象后,同是與該對象名同名的Demo類也被定義了??梢杂肈emo來引用該單例對象,如下所示執(zhí)行后,可以看到窗口的左上角打開一個小窗口。

 
 
 
  1. scala> Demo
  2. res0: Demo.type = Demo$@1205d8d

Scala與Java在語法上的差異

這里簡單地列舉一下Scala與Java在語法上的差異。

? 類型的聲明不是“類型 變量 = 值”而是“變量:類型 = 值”。但是,在類型推斷可能的情況下類型聲明可以省略。

? 不可變的變量用val,可變的變量用var來聲明。任意的數據都可以用def來命名(包括val也可以替換成def)。使用def來聲明函數和方法。

? 語句分隔符“;”是可選的,通常用換行來表示。

? 一連串復合語句可以用“;”來分割,然后用“{”和“}”塊來包括起來。如果單語句的不用大括號包括也可以。例如for語句既可以是for(i < - List(1, 2, 3, 4)){println(i)},也可以是for(i < - List(1, 2, 3, 4)) println(i)。

? 包括數字、字符串和數組,所有的數據都是對象。包括Java的原類型int、double和bool等所有的數據都對應于Scala中的相應類。

? void作為Unit類來處理,Unit的唯一實例是()。

? 以array(i)來使用數組的索引而不是array[I]。數組項目的取得array(i)和更新array(i) = x也可以認為是調用array.apply(i)和array.update(i, x)方法。

? []可以用來指定范型的具體類型,比如type IList = List[Int]為聲明項目類型為Int的列表類型??梢杂胊sInstanseOf[T]方法來強制轉換類型,雖然使用了范型之后大部分情況下是用不著的。

? for循環(huán)并不是語法,而是被定義為稱作for-comprehension的語法糖,***被轉換成map和filter等方法的組合。

? 有意放棄了靜態(tài)(static)的概念,而是用單例對象來取代了靜態(tài)對象和方法。不是用class而是用object像“object Singleton extends Object { val data: Int }”一樣被定義,其中的屬性可以用來代替靜態(tài)成員。

? 使用import語句來引入包和類,并用“_”代替了“*”。比如import javax.swing.JFrame; import javax.swing.JFrame._??梢愿袷?“import javax.swing.{JFrame=>MyWindow}”來聲明類型的別名。

結束語

下一講將說明以特征(Trait)為形式的mixin式的多重繼承方法、集合、for和map等高階函數、使用閉包的函數式編程。


當前文章:Scala講座:函數、操作符及與Java的比較
標題網址:http://www.5511xx.com/article/djgdiod.html