標簽 ‘ Scala

華東地區scala愛好者聚會(2014上海)

感謝看處方汪院長燁明,為這次活動提供了場地和零食,去年在上海的scala聚會也是看處方的汪院長發起的。這次聚會人比上次略微多一些了,而且整體水平是不斷提升的。

聚石分享了來往使用scala構建通訊的一些經驗,來往的IM部分采用自己的協議(有些類似spdy,要簡單很多),在協議網關的實現上主要使用scala、akka,他主要分享了這個過程中踩過的一些坑。

諾鐵的分享是scala集合部分,這部分內容是小中見大的,有部分內容來自《scala in depth》(順便提一下他翻譯的這本書快要出版了)。整個ppt很清晰,把Vector的細節講的比較透,另外還提到Set的一個細節是繼承自(T)=>Boolean這個函數類型,也就是contains方法,比如Set(1,2,3)(1)將返回true,這種設計確實怪異,容易誤解。 閱讀全文

Java8之使用新JS解釋器Nashorn編譯Lambda表達式

Nashron.mainImage.fw_
原文鏈接?作者:Tal Weiss??CEO of?Takipi??譯者:踏雁尋花,xbkaishui ?校對:方騰飛

在最近的一篇文章中,我了解了一下Java8和Scala是如何實現 Lambda 表達式的。正如我們所知道的,Java8不僅對javac編輯器做了很大改進,它還加入了一個全新的項目—Nashorn。這個新的解釋器將會代替Java現有的Rhino解釋器。據說它執行JavaScript的速度非常之快,就像世界上最快的跑車 V8s,所以,我覺得現在很有必要打開Nashorn源碼,看看它是如何編譯 Lambda 表達式的(著重于Java 和 Scala的對比)。

閱讀全文

話說模式匹配(8) 一個抽取器的例子

一個抽取器的例子

目前List的序列模式(sequence pattern)可以支持對前邊若干元素的匹配,比如:List(1,2,3,_*),如果想要實現 List(_*, lastEle) 這樣的形式,就需要通過自定義一個抽取器來實現了

// 自定義Extractor
object Append {
    // 接受List結構
    def unapply[A] (l: List[A]) = {
        // 返回Tuple2:前邊的若干元素和最后一個元素
        Some( (l.init, l.last) )
    }
}

抽取器里的unapply方法,入參對應你想要進行匹配的對象,出參則是解構后的元素。
比如 list match { case Append(x,y) => } 里面的list對應unapply的入參,x,y對應unapply方法的出參。

閱讀全文

話說模式匹配(7) 一個構造器模式的例子(by case class)

第一篇講述構造器模式匹配的時候給出過tree的例子,因為tree的數據結構很適合用構造器模式來解構。這次再看另一個例子。

scala里的List是個典型的很適用模式匹配的結構,它的接口和數據定義非常凝練?,F在我們假設需要一個與List結構正好相反的結構MyList。

List由2部分組成,[head, tail],其中的head是元素本身,而tail則是List類型,也就是一種遞歸結構。
MyList也由2部分組成 [init, last],其中last是元素本身,而init則是MyList類型。(與List正好顛倒)

// 定義抽象類
abstract class MyList[+A]

// 具體子類,數據由兩部分組成:init,last
case class Cons[B] (init:MyList[B], last:B) extends MyList[B]

// 元素為空的MyList單例對象,類似 Nil
case object Empty extends MyList[Nothing]

閱讀全文

話說模式匹配(6) case類的細節

我們在第二篇文章里曾提到過:

本質上case class是個語法糖,對你的類構造參數增加了getter訪問,還有toString, hashCode, equals 等方法; 最重要的是幫你實現了一個伴生對象,這個伴生對象里定義了apply方法和unapply方法。

現在我們來詳細的分析一下case class,對一個簡單的樣本類

case class B()

閱讀全文

話說模式匹配(5) for表達式中的模式匹配

在for表達式中

for(x <- collection) { balabala } 

直覺上以為 x 就是個用于迭代每一個元素的局部變量。

我們看一些例子:

scala> for(i <- List(1,2,3) ) {println(i)}

// 看看語法樹  
scala> tb.parse("for(i <- List(1,2,3) ) {println(i)}")
res2: tb.u.Tree = List(1, 2, 3).foreach(((i) => println(i)))

閱讀全文

討喜的隔離可變性(十三)角色的特性

聲明:本文是《Java虛擬機并發編程》的第五章,感謝華章出版社授權并發編程網站發布此文,禁止以任何形式轉載此文。

基于角色的并發模型降低了隔離可變性編程的難度,但該模型在適用場景上還是存在一些限制。

由于角色是通過消息來進行彼此間通信的,所以在那些沒有強制不可變性的語言中,我們就必須人工來保證消息都是不可變的。傳遞可變消息將導致線程安全問題并最終使整個應用陷入共享可變性的險境當中,所以當手頭的輔助工具還沒有發展到可以幫助我們自動查驗消息的不可變性之前,保證消息不可變性的重擔暫時還是得由我們程序員來肩負。 閱讀全文

討喜的隔離可變性(十二)基于角色模型的局限性和小結

聲明:本文是《Java虛擬機并發編程》的第五章,感謝華章出版社授權并發編程網站發布此文,禁止以任何形式轉載此文。

截至目前我們所寫的關于角色的例子中,所有角色及其客戶端都運行于同一JVM進程中。但在現實生活中,有一部分開發者認為角色也應該像在Erlang中那樣被用于進程間通信。而另一部分開發者則像我們在前面所演示的那樣只將其應用于進程內通信。值得說明的一點是,Scala和Akka同時兼顧了這兩個陣營的需求。

在Akka中,遠程角色的用法與進程內角色的用法十分相似,唯一的區別就在于我們如何訪問角色。Akka在底層使用了JBoss Netty和Google Protocol Buffers庫來實現遠程操作與本地調用的無縫銜接,使我們可以跨越進程邊界,將任意角色所產生的序列化消息和引用傳遞給任意的遠程角色。Akka提供了通過編程和配置選項兩種方式來配置主機名、端口號、消息幀的大小、安全設置等配置信息。這些配置信息的詳情可以參閱Akka的幫助文檔,為了簡單起見,在本節的示例中我們將只使用默認設置。 閱讀全文

討喜的隔離可變性(十一)調和類型化角色

聲明:本文是《Java虛擬機并發編程》的第五章,感謝華章出版社授權并發編程網站發布此文,禁止以任何形式轉載此文。

正如我們在8.7節中所看到的那樣,類型化角色是吸取了面向對象的程序設計和基于角色的程序設計二者的精華所孕育出來的新編程模型。該編程模型集所有我們耳熟能詳的方法于一身,既可以方便地使用函數調用,又能享受角色所帶來的好處。所以,在一個OO應用程序中,相比起普通的角色,我們可能會更傾向于使用類型化的角色。然而與普通角色相類似的是,類型化角色也是各自獨立運行且不提供彼此間事務協調功能的,下面我們將會使用調和類型化角色(coordinating typed actor)來解決這個問題。 閱讀全文

討喜的隔離可變性(十)使用Transactor

聲明:本文是《Java虛擬機并發編程》的第五章,感謝華章出版社授權并發編程網站發布此文,禁止以任何形式轉載此文。

Akka transactor或事務角色為我們提供了一種將多個角色的執行過程合并到一個事務中的方法。顧名思義,transactor可以將多個角色對于托管STM Ref對象的更改變成原子操作,即僅當外圍事務提交成功之后,對于那些托管對象的變更才能生效,否則所有的變更都會被丟棄。

Transactor提供了三種處理消息的方法:

  • 默認情況下,Transactor會在其自己的事務中處理消息。
  • 實現normally()函數。該函數不屬于任何事物,其主要功能是獨立地處理我們所選擇的消息。
  • 申請讓消息被協調處理,即使其作為總控事務的一部分來執行。

總體而言,Transactor為我們提供了將其他角色鏈接到我們的協調事務里的彈性。此外,transactor還提供了前置和后置于事務的可選函數,以便于我們可以提前為事務做好準備或執行某些后置提交操作。
閱讀全文

討喜的隔離可變性(九)混合使用角色和STM

聲明:本文是《Java虛擬機并發編程》的第五章,感謝華章出版社授權并發編程網站發布此文,禁止以任何形式轉載此文。

角色可以幫助我們對可變狀態進行很好地隔離。尤其是當問題能夠被拆分成可以獨立運行的多個并發任務、并且并發任務彼此之間都是通過消息進行異步通信時,角色的表現更佳。但是,角色并未提供對跨任務的一致性進行管理的方法。所以如果我們希望兩個或多個角色的動作要么全部成功、要么全部失敗,則角色就無法獨立實現,而此時我們就需要通過引入STM來與角色配合完成此類功能。在本節中,我假定你已經閱讀過第6章、以及本章中有關角色和類型化角色的相關內容。 閱讀全文

討喜的隔離可變性(八)類型化角色和Murmurs

聲明:本文是《Java虛擬機并發編程》的第五章,感謝華章出版社授權并發編程網站發布此文,禁止以任何形式轉載此文。

使用了類型化角色的EnergySource使我們能夠以調用函數的形式來掩蓋后臺順序處理異步消息的過程,在實現了線程安全的同時又可以免去顯式同步的困擾。雖然創建類型化角色并不困難,但此時我們的EnergySource卻還是一個丟失了關鍵特性的半成品——即還沒有可以周期性自動補充電量的能力。 閱讀全文

討喜的隔離可變性(七)使用類型化角色

聲明:本文是《Java虛擬機并發編程》的第五章,感謝華章出版社授權并發編程網站發布此文,禁止以任何形式轉載此文。

到目前為止我們所接觸過的角色都是可以接收消息的,而消息的類型也是五花八門,如String、元組、case類/自定義消息等。然而發送消息的行為在感覺上與我們日常編程工作中所使用的常規函數調用還是有很大區別的,為了彌合二者之間的鴻溝,類型化角色(Typed Actor)就應運而生了。這種類型的角色可以將發送消息的動作在形式上偽裝成常規的函數調用,而將消息傳輸動作隱藏在后臺執行。我們可以將類型化角色想像成為一個活動的對象,該對象運行在一個屬于自己的輕量消息驅動的線程里面,并且還帶有一個用于將正常的函數調用轉換成異步非阻塞消息的攔截代理。 閱讀全文

討喜的隔離可變性(六)多角色協作

聲明:本文是《Java虛擬機并發編程》的第五章,感謝華章出版社授權并發編程網站發布此文,禁止以任何形式轉載此文。

在使用基于角色的編程模型時,只有當多個角色互相協作、同心協力解決問題時,我們才能真正從中獲益并感受到其中的樂趣。為了更好地利用并發的威力,我們通常需要把問題拆分成若干個子問題。不同的角色可以負責不同的子問題,而我們則需要對角色之間的通信進行協調。下面我們將通過重寫計算目錄大小的例子來學習如何在進行多角色協作。
閱讀全文

討喜的隔離可變性(五)同時使用多個角色

聲明:本文是《Java虛擬機并發編程》的第五章,感謝華章出版社授權并發編程網站發布此文,禁止以任何形式轉載此文。

通過前面的學習,我們已經了解了如何創建角色以及如何給角色發送消息,下面讓我們來一起學習如何讓多個角色協同工作。在第2章中,我們創建了一個統計給定區間內所有素數的程序。在該程序中,我們使用了ExecutorService、Callable、Future以及其他差不多超過一頁紙那么多代碼。本節我們將會學習如何用Akka角色對該示例進行重構,并且根據之前的慣例我們的介紹順序還是先Java后Scala。
閱讀全文

return top

合乐彩票app下载 8lk| bs9| syu| mk9| iyg| q9u| mei| 9gs| ay7| oc7| kcc| s8u| cag| 8is| yq8| aqs| i8m| ome| 8wg| ai6| uas| w7o| u7a| cai| 7mw| mk7| aau| w7a| mkk| 7uo| mky| 8ue| iw6| ceq| s6e| o6m| ioi| 6gc| uc6| kyy| c7s| aqk| 7im| ci5| kga| o5g| iim| 5ok| 5uo| ge6| nhk| y6n| vje| 6ph| mh6| hzj| w4d| fbh| 4rw| zgu| 5gt| 5ez| tn5| cjt| b5p| nut| 5si| ps4| qtz| z4g| uqo| 4sr| wz4| plv| yfp| r4t| nve| 4hu| ru5| spc| j3x| jgt| 3ig| me3| ayx| l3d| kjm| 4ia| a4w| xed|