讀Java實戰(第二版)筆記10_函數式編程的技巧

来源:https://www.cnblogs.com/lying7/archive/2023/02/15/17109126.html
-Advertisement-
Play Games

驗證以及國際化 1.概述 (1)概述 對於輸入的數據(比如表單數據),進行必要的驗證,並給出相應的提示信息 對於驗證表單數據,SpringMVC 提供了很多使用的註解,這些註解由 JSR 303驗證框架提供。 (2)JSR 303 驗證框架 JSR 303 是 Java 為 Bean 數據合法性校驗 ...


1. 設計原則

1.1. 將所有你願意接受的作為參數的函數可能帶來的副作用以文檔的方式記錄下來

1.2. 最理想的情況下你接收的函數參數應該沒有任何副作用

1.3. 延遲數據結構是強力武器

1.4. 所有使用持久化數據結構的用戶都必須遵守“不修改”原則

2. 一等函數

2.1. first-class function

2.2. 能夠像普通變數一樣使用的函數

2.2.1. 可以作為參數傳遞

2.2.2. 可以作為結果返回

2.2.3. 能存儲在數據結構中的函數

2.3. ::操作符

2.3.1. 創建一個方法引用,像使用函數值一樣使用方法

2.4. Lambda表達式

2.4.1. 直接表示方法的值

3. 高階函數

3.1. higher-order function

3.2. 接受至少一個函數作為參數

3.3. 返回的結果是一個函數

3.4. 滿足任一要求

3.4.1. comparing

3.4.2. andThen

3.4.3. compose

4. 柯里化

4.1. 幫助你模塊化函數和重用代碼的技術

4.2. 將具備兩個參數(比如,x和y)的函數f轉化為使用一個參數的函數g,並且這個函數的返回值也是一個函數,它會作為新函數的一個參數

4.3. 後者的返回值和初始函數的返回值相同,即f(x, y) = (g(x))(y)

5. 部分求值

5.1. partially applied

5.2. 當一個函數使用的所有參數僅有部分(少於函數的完整參數列表)被傳遞時

6. 持久化數據結構

6.1. 數據結構的值始終保持一致,不受其他部分變化的影響

6.2. final只能應用於類的欄位,無法應用於它指向的對象,如果你想要對對象進行保護,則需要將其中的欄位聲明為final,以此類推

6.3. 在其被修改之前會對自身前一個版本的內容進行備份

6.4. 能避免不必要的防禦式複製

7. 資料庫中的持久化

7.1. 生命周期比程式的執行周期更長的數據

8. 函數式更新

8.1. 禁止使用帶有副作用的方法

8.2. 沒有改動任何現存的數據結構

8.3. 會導致過度的對象複製

9. fupdate

9.1. 純函數式

9.2. 會創建一個新的樹,並將其作為結果返回,通過參數的方式實現共用

10. update

10.1. 每一個update的用戶都希望共用同一份數據結構,也希望能瞭解程式任何部分所做的更新

11. 延遲計算

11.1. 無法聲明一個遞歸的Stream,因為Stream僅能使用一次

11.1.1. 一旦你對Stream執行一次終端操作調用,它就永久地終止了

11.2. 如果它們能讓程式設計更簡單,就儘量使用它們

11.3. 如果它們會帶來無法接受的性能損失,就嘗試以更加傳統的方式重新實現它們

11.4. 可以通過輔助方法(supplier)即時地創建列表中的元素

11.4.1. 輔助方法能幫忙創建更多的數據結構

12. 結合器

12.1. 函數式的思想

12.2. 將兩個或多個函數或者數據結構進行合併

12.3. 接受兩個或多個方法(函數)做參數且返回結果是另一個函數的方法

13. 記憶表

13.1. memoizatio)

13.2. 為方法添加一個封裝器,在其中加入一塊緩存

13.3. 遵守“引用透明性”原則的函數,其計算結構可以進行緩存

14. 引用透明性原則

14.1. 使用相同的參數產生同樣的結果

14.2. 使用equal對數據結構值進行比較

15. 模式匹配

15.1. 函數式的特性

15.1.1. 能幫助解包數據類型

15.1.2. 訪問者模式

15.1.3. Java語言中switch語句的一種泛化

15.2. 模式匹配為操縱類樹型數據結構提供了一個極其詳細又極富表現力的方式

15.2.1. Scala是面向表達式的

15.2.2. 可以避免出現大量嵌套的switch或者if-then-else語句和欄位選擇操作相互交織的情況

15.2.3. Java的switch和if-then-else無法完全實現模式匹配的思想

15.3. 用Lambda,原則上你的代碼里不應該使用if-then-else

15.3.1. 方法調用

15.3.1.1. myIf(condition, () -> e1, () -> e2);

15.3.1.2.

 static <T> T myIf(boolean b, Supplier<T> truecase, Supplier<T> falsecase) 
 {
            return b ? truecase.get() : falsecase.get();
 }

15.3.2. Lambda表達式能以簡單的方式實現單層的模式匹配


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • mysql日誌種類 錯誤日誌 二進位日誌 查詢日誌 慢查詢日誌 日誌 錯誤日誌 錯誤日誌是mysql中最重要的日誌之一,它記錄了當mysqld啟動和停止時,以及伺服器在運行過程中發生任何嚴重錯誤時的相關信息,當資料庫出現任何故障導致無法正常使用時,建議首先查看此日誌。 該日誌是預設開啟的,預設存放目 ...
  • 本文翻譯自: Composition in Flutter & Dart 在 Flutter & Dart 中使用組合創建模塊化應用程式。 什麼是組合? 在dictionary.com 中 composition 的定義為:將部分或者元素組合成一個整體的行為。簡單說,組合就像堆樂高積木,我們可以將積 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 前言 不知各位朋友現在在web端進行登錄的時候有沒有註意一個變化,以前登錄的時候是直接賬號密碼通過就可以直接登錄,再後來圖形驗證碼,數字結果運算驗證,到現在的拼圖驗證。這一系列的轉變都是為了防止機器操作,但對於我們來說,有億點麻煩,但也沒 ...
  • 字元串解讀 es6加強了對Unicode 的支持,允許\uxxxx的形式展現一個字元,例如: console.log('\u0061'); // 列印 a \u後面的為字元的 Unicode 碼點 \u 後面4位 xxxx 但是這種寫法只識別 \u0000 到 \UFFFF 之間的字元,超出需要使用 ...
  • 閱識風雲是華為雲信息大咖,擅長將複雜信息多元化呈現,其出品的一張圖(雲圖說)、深入淺出的博文(雲小課)或短視頻(雲視廳)總有一款能讓您快速上手華為雲。更多精彩內容請單擊此處。 摘要:本篇雲小課主要指導使用Springboot應用的用戶,快速部署業務到函數工作流FunctionGraph服務。 本文分 ...
  • 我們是袋鼠雲數棧 UED 團隊,致力於打造優秀的一站式數據中台產品。我們始終保持工匠精神,探索前端道路,為社區積累並傳播經驗價值。 前言 單元測試是一種用於測試“單元”的軟體測試方法,其中“單元”的意思是指軟體中各個獨立的組件或模塊。開發者需要為他們的代碼編寫測試用例以確保這些代碼可以正常使用。 在 ...
  • 這是一個投資80億的智能化的稀土廠區規劃項目,2023年年前與該項目的一號負責人進行彙報與交流,年後雙方人員進一步對接。 ...
  • 構造函數和析構函數 構造函數是類的入口函數 析構函數是類的銷毀函數 1、構造函數 a、構造函數預設是public類型的,如果定義private則定義外部不能進行對象的創建,所以只能是公有函數 b、構造函數是入口函數,所以可以進行參數的初始化,可以對部分或全部的函數進行初始化操作 c、構造函數是可以有 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...