Trampolining:java開發人員的實用指南
無需Stack的遞迴計算
Trampolining是一個具有兩個具體實現的介面,其中一個簡單地表示結果,另一個表示計算的下一階段。
透過將計算分解成單獨的步驟,我們獲得了很多好處。其中之一是遞迴計算而不需要堆疊 。 我們可以移動任何遞迴呼叫在呼叫方法之外執行,從而將遞迴轉換為迭代。
斐波納契生成:
import static com.aol.cyclops.control.Trampoline.done; import static com.aol.cyclops.control.Trampoline.more; public void fib() { for(int i=0;i<100_000;i++) System.out.println(fibonacci(i, 0l, 1l).get()); } public Trampoline<Long> fibonacci(Integer count, Long a, Long b) { return count==0 ? done(a) : more(()->fibonacci (count - 1, b, a + b)); } <p class="indent"> |
當呼叫Trampoline的return語句時,內部遍歷呼叫隨著核心例項返回是More就不斷增加,一旦返回例項是Done就停止,基本上,我們透過基於迴圈的遞迴轉換為迭代,關鍵的啟用機制是Trampoline.more是一個惰性操作。
無執行緒併發
Trampolines另一個好處是能夠在同一個執行緒上交錯執行兩個或多個函式。一個實現案例我們內部的cyclops-react,使用先進的並行流型別LazyFutureStream.,能讓資料消費者在沒有資料可用時切換為資料生產者。
消費者與生產者的協同
讓我們展示如何使用Trampolines建立協同例程co-routines,在同一個執行緒上執行的交錯函式。
在下面的示例中,我們有一個bog標準JDK佇列,填充倒入某個單值。 我們想讀取三個值,但是我們不想發生任何讀取失敗情況。 如果沒有資料可用,我們希望我們的閱讀者也就是消費者能夠處理這種情況併產生一些資料。
交織功能的最簡單的方法是簡單地(硬編碼)寫在一起。 這是簡單但不靈活,它會捆綁到一個特定的實現。我們可以傳入一個Trampolines,如果沒有存在資料,那麼它會讓資料使用者產生資料。 因為我們的程式碼庫足夠靈活,可以處理未來的其他策略(也許消費者應該休眠一段時間?或者當前執行緒不斷檢查新資料是否到達)。
Queue<String> data = QueueX.of("hello"); public void consumerToProducer(){ System.out.println(nextData(produceToConsume())); System.out.println(nextData(produceToConsume())); System.out.println(nextData(produceToConsume())); /* hello world world */ } private Trampoline<String> produceToConsume(){ return Trampoline.more( ()->{ produce(); return done(consume()); }); } public String nextData(Trampoline<String> noDataHandler){ return getData(noDataHandler).get(); } private Trampoline<String> getData(Trampoline<String> noDataHandler){ return data.size()>0 ? done(consume()) : noDataHandler; } private String consume(){ return data.poll(); } public void produce(){ data.offer("world"); } <p class="indent"> |
當佇列為空時,將執行noDataHandler Trampoline,因此,新資料被新增到佇列以供消費者使用。
LazyFutureStream
我們的專案cyclops引入了FutureStream概念,這是每個資料點嵌入一個Future的資料流,戶端不直接操作Future,而是像普通一樣定義(高階)Stream操作,由庫包管理Futures的流水線和它們的並行執行。
此外可以將Trampolines構建入API:實現Eval、map / flatMap 尾遞迴、Maybe、模式匹配等功能。詳細見原文:
相關文章
- 面向Java開發人員的Flex開發指南JavaFlex
- 面向 Java 開發人員的 Scala 指南: 類操作Java
- Java實用系統開發指南Java
- 開發人員怎麼看實施人員
- to《Java實用系統開發指南》作者Java
- 急需……《JAVA實用系統開發指南》Java
- Java實用系統開發指南的疑問Java
- 給Web開發人員的以太坊入坑指南Web
- 給 Web 開發人員的以太坊入坑指南Web
- 面向Web開發人員的Linux實用入門WebLinux
- Web開發人員的福音!8個實用的SVG工具WebSVG
- 《Java實用系統開發指南》初感Java
- 開發人員菜鳥實用設計資源
- 《Java實用系統開發指南》和《JAVA與模式》?Java模式
- 急需《java實用系統開發指南》的原始碼?Java原始碼
- 關於《JAVA實用系統開發指南》引申的~Java
- 蘋果應用開發人員的成功之道蘋果
- [北京]招聘軟體開發人員(java)Java
- 狗屎書籍《Java實用系統開發指南》Java
- 關於“Java實用系統開發指南”的學習Java
- 成功淘到banq的《java實用系統開發指南》Java
- 我的“Java實用系統開發指南”即將出版Java
- 2017 全棧開發人員修煉指南全棧
- 13 個Typescript 實用型別:開發人員的備忘單TypeScript型別
- 開發人員 vs 測試人員
- 關於JAVA實用系統開發的指南的問題Java
- 測試人員學Java入門指南Java
- 開發人員愛開發
- Java開發人員必備Linux命令JavaLinux
- JAVA開發人員面試題書目錄Java面試題
- 【代友招人】java開發核心人員(上海)Java
- Oracle開發人員 JAVA儲存過程OracleJava儲存過程
- 我也想搞到《Java實用系統開發指南》Java
- Java實用系統開發指南出版了嗎?Java
- 那位能有java實用系統開發指南的光? size=Java
- 用Java抓取天眼查公開失信人員資訊Java
- 為什麼開發人員從Java轉GoJavaGo
- 美資上海招聘Java軟體開發人員Java