日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java 示例_功能Java示例 第5部分–将I / O移到外部

發布時間:2023/12/3 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 示例_功能Java示例 第5部分–将I / O移到外部 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

java 示例

這是稱為“ Functional Java by Example”的系列文章的第5部分。

在上一部分中,我們停止了對文檔的變異,并返回了數據的副本。 現在,我們需要移走一些I / O。

如果您是第一次來,最好是從頭開始閱讀。 它有助于了解我們從何處開始以及如何在整個系列中繼續前進。

這些都是這些部分:

  • 第1部分–從命令式到聲明式
  • 第2部分–講故事
  • 第3部分–不要使用異常來控制流程
  • 第4部分–首選不變性
  • 第5部分–將I / O移到外部
  • 第6部分–用作參數
  • 第7部分–將失敗也視為數據
  • 第8部分–更多純函數

我將在每篇文章發表時更新鏈接。 如果您通過內容聯合組織來閱讀本文,請查看我博客上的原始文章。

每次代碼也被推送到這個GitHub項目 。

將I / O移到外面

還記得我們以前留下的東西嗎?

class FeedHandler {Webservice webserviceDocumentDb documentDbvoid handle(List<Doc> changes) {changes.findAll { doc -> isImportant(doc) }.each { doc ->createResource(doc).thenAccept { resource ->documentDb.update(setToProcessed(doc, resource))}.exceptionally { e ->documentDb.update(setToFailed(doc, e))}}}private CompletableFuture<Resource> createResource(doc) {webservice.create(doc)}private boolean isImportant(doc) {doc.type == 'important'}private Doc setToProcessed(doc, resource) {doc.copyWith(status: 'processed',apiId: resource.id)}private Doc setToFailed(doc, e) {doc.copyWith(status: 'failed',error: e.message)}}

我在本系列的每個部分中開發的示例是某種“提要處理程序”,用于處理文檔。

處理效果如何?

  • 一份或多份文件進來
  • 如果文檔“很重要”,則將其保存到Webservice API中,該API將為其創建并返回資源
  • 如果成功,則將文檔標記為已處理
  • 如果失敗,則將文檔標記為失敗
  • 最終,文檔將在數據庫中更新
  • Web服務可以是REST服務(因為我們在談論資源 ),數據庫可以是CouchDB或MongoDB的文檔存儲(因為我們在談論文檔 ),但這并不重要。

    重要的是通常在任何系統中都涉及一些I / O(輸入/輸出)。 從文件系統讀取信息,將信息存儲到數據庫中,在Web服務之間通過網絡進行通信。

    正如我們在上一期文章中所看到的,我們希望我們的功能盡可能純凈 ,沒有任何副作用。 不幸的是,真正的系統必須與外界交互才能有意義。

    我們還如何獲取輸入到系統中的信息,或向用戶輸出什么呢? I / O的一些示例是:

    • 文件系統訪問
    • 網絡插座
    • HTTP請求
    • JDBC操作
    • 啟動線程
    • 系統時鐘訪問

    通過將setToProcessed / setToFailed方法上移到調用鏈上一步,我們已經擺脫了對數據庫的訪問,但是它仍然位于FeedHandler 。

    我們能做的最好的就是將I / O移到系統外部。

    我們可以做的最明顯的更改是完全擺脫數據庫,而只是從handle()返回新的更新文檔。

    擺脫數據庫

    更改

    .thenAccept { resource ->documentDb.update(setToProcessed(doc, resource)) } .exceptionally { e ->documentDb.update(setToFailed(doc, e)) }

    .thenApply { resource ->setToProcessed(doc, resource) } .exceptionally { e ->setToFailed(doc, e) }

    擺脫documentDb 。

    我們只是返回所有修改的文檔,甚至在調用鏈的更遠處。 這就是為什么我們還必須……

    …擺脫虛無

    從更改返回類型

    void handle(...)

    List<Doc> handle(...)

    因此處理過的文檔會一直返回到外部。

    這并不是說我們不再與任何數據庫進行任何交互,而是不再需要我們的FeedHandler組件! 通過將任何I / O移至系統的外圍,中間的所有內容都可以盡可能地純凈。

    還記得Haskell,這是一種“純”功能語言嗎? 從“ 學到了偉大的Haskell” :

    事實證明,Haskell實際上擁有一個非常聰明的系統來處理具有副作用的功能,這些功能將我們程序的純凈部分和不純凈的部分整齊地分開了,它完成了所有骯臟的工作,例如與鍵盤和屏幕。 將這兩個部分分開,我們仍然可以推理我們的純程序,并利用純凈提供的所有功能,例如惰性,健壯性和模塊化,同時與外界進行有效的通信。

    當它在90年代被發明時,它引入了IO monad來處理I / O。 任何函數,例如從外部讀取,都必須使用返回類型IO ,該類型實際上是由編譯器檢查的。

    這有一些好處,例如Haskell編譯器可以自由地重新排序所有非IO代碼以進行優化。 從純函數和I / O :

    由于純函數代碼就像代數一樣,因此編譯器可以將所有非IO函數視為數學方程式。 這有點類似于關系數據庫如何優化查詢。

    在Java中,我們沒有針對這些內容的特定編譯器支持,但是有一些事情我們需要照顧好自己。

    記住: void是一個沉Kong。 任何返回void方法要么毫無意義,要么具有副作用,例如寫入顯示,網絡,文件或數據庫,即與外部系統的交互。 代替執行I / O作為副作用,而是向調用方返回一個值,以描述與外部系統的交互。

    現在就這樣!

    翻譯自: https://www.javacodegeeks.com/2018/11/functional-java-example-move-outside.html

    java 示例

    總結

    以上是生活随笔為你收集整理的java 示例_功能Java示例 第5部分–将I / O移到外部的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。