讀Java實戰(第二版)筆記09_函數式的思考

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

電商網站Web自動化測試實戰( 編寫京東搜索腳本) 1,打開京東頁 京東首頁地址:https://www.jd.com/,故進入京東首頁如下: 2,打開瀏覽器開發者模式 定位元素前需先打開瀏覽器開發者模式,查看頁面源碼 例-打開chrome開發者模式: windows:快捷鍵F12 Mac ios ...


1. 規則

1.1. 傳遞參數,返回結果

1.1.1. 異常和中斷都不算返回結果

1.2. 減少共用的可變數據結構能幫助你降低維護和調試程式的代價

2. 耦合性

2.1. 軟體系統中各組件之間是否相互獨立

3. 內聚性

3.1. 系統的各相關部分之間如何協作

4. 無狀態的行為

4.1. 流水線中的函數不會由於需要等待從另一個方法中讀取變數,或者由於需要寫入的變數同時有另一個方法正在寫而發生中斷

4.2. 無須擔心鎖引起的各種問題

4.3. 充分發掘系統的併發能力

5. 副作用

5.1. 函數的效果已經超出了函數自身的範疇

5.2. 除了構造器內的初始化操作,對類中數據結構的任何修改,包括欄位的賦值操作

5.3. 拋出一個異常

5.4. 進行輸入/輸出操作

6. 無副作用

6.1. 純粹的

6.2. 如果一個方法既不修改它內嵌類的狀態,也不修改其他對象的狀態,使用return返回所有的計算結果

6.3. 如果構成系統的各個組件都能遵守這一原則,該系統就能在完全無鎖的情況下,使用多核的併發機制,因為任何一個方法都不會對其他的方法造成干擾

6.4. 瞭解程式中哪些部分是相互獨立的

7. 不可變對象

7.1. 一旦完成初始化就不會被任何方法修改狀態

7.2. 一旦一個不可變對象初始化完畢,它永遠不會進入到一個無法預期的狀態

7.3. 線程安全的

8. 聲明式編程

8.1. 關註要做什麼

8.2. 更加接近問題陳述

9. 命令式編程

9.1. 指令和電腦底層的辭彙非常相近

9.2. 專註於如何實現

10. 引用透明性

10.1. 沒有可感知的副作用

10.1.1. 不改變對調用者可見的變數

10.1.2. 不拋出異常

10.1.3. 不進行I/O

10.2. 如果一個函數只要傳遞同樣的參數值,總是返回同樣的結果,那這個函數就是引用透明的

11. 記憶化

11.1. 緩存

11.2. 對代價昂貴或者需長時間計算才能得到結果的變數值的優化

11.2.1. 通過保存機制而不是重覆計算

12. 函數式編程

12.1. 程式有一定的副作用

12.1.1. 該副作用不會被其他的調用者感知

12.1.1.1. 如果沒人能感知的話,函數式也允許進行變更,這意味著可以修改局部變數

12.1.2. 調用者不需要知道,或者完全不在意這些副作用

12.2. 如果有副作用

12.2.1. 必須設法隱藏它們的非函數式行為

12.2.2. 否則就不能調用這些方法

12.2.3. 需要確保它們對數據結構的任何修改對於調用者都是不可見的,可以通過首次複製,或者捕獲任何可能拋出的異常實現這一目的

12.3. 函數式的函數或方法都只能修改本地變數

12.3.1. 所有的欄位都為final類型

12.3.2. 所有的引用類型欄位都指向不可變對象

12.3.3. 引用的對象都應該是不可修改的對象

12.4. 選擇使用引用透明的函數

12.5. 不應該拋出任何異常

12.5.1. 選擇在本地局部地使用異常,避免通過介面將結果暴露給其他方法,這種方式既取得了函數式的優點,又不會過度膨脹代碼

13. 局部函數式(partial function)

13.1. 大多數的輸入值都返回一個確定的結果

13.2. 對另一些輸入值,它的結果是未定義的,甚至不返回任何結果

13.2.1. 除法,如果除法的第二操作數是0

13.2.2. 開平方運算,開平方的參數為負數

13.2.3. 使用Optional類型

14. 純粹的函數式編程

14.1. 不提供像while或者for這樣的迭代結構

14.1.1. 這種結構經常隱藏著陷阱,誘使你修改對象

15. 遞歸recursion

15.1. 函數式編程特別推崇的一種技術

15.2. 培養你思考要“做什麼”的編程風格

15.3. 每個程式都能使用無須修改的遞歸重寫,通過這種方式避免使用迭代

15.3.1. 採用遞歸可以取代迭代式的結構,比如while迴圈

15.3.2. 使用遞歸,可以消除每步都需更新的迭代變數

15.4. 遞歸的形式通常效率都更差一些

15.4.1. 因為每次執行遞歸方法調用都會在調用棧上創建一個新的棧幀,用於保存每個方法調用的狀態(即它需要進行的乘法運算),這個操作會一直指導程式運行直到結束

15.4.2. 很容易遭遇StackOverflowError異常

15.5. 大多數時候編程的效率要比細微的執行時間差異重要得多

15.6. 尾調優化(tail-call optimization)

15.6.1. 編寫方法的一個迭代定義,不過迭代調用發生在函數的最後

15.6.1.1. 調用發生在尾部

15.6.2. Java不支持這種優化

15.6.3. Scala、Groovy和Kotlin,支持對這種形式的遞歸的優化

15.6.3.1. 最終實現的效果和迭代不相上下(它們的運行速度幾乎是相同的)


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

-Advertisement-
Play Games
更多相關文章
  • Postgresql通過docker進行高可用部署 在postgresql官網看了pgpool-II的文檔,發現部署比較麻煩 pgpool-II官方文檔:https://www.pgpool.net/mediawiki/index.php/Documentation 為了方便快捷還是使用docker ...
  • 2022年12月22日工業和信息化部令第57號公佈,自2023年7月1日起施行 主要總結為以下幾點: 1.型號核准證的有效期不短於2年,不超過5年,型號核准證每次延續的有效期不超過5年 2.微功率短距離無線電發射設備使用說明中應當註明“使用微功率短距離無線電發射設備應當符合國家無線電管理有關規定”字 ...
  • html基礎入門 1. 什麼是html Hypertext Markup Language 超文本標記語言 2. 基本結構 <!DOCTYPE html> <!-- 註釋:此為html5的聲明方式 --> <html> <head></head> <body></body> </html> 順序 聲 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 前言 您或許會疑惑,網上那麼多去重方法,這篇文章還有什麼意義? 彆著急,這篇文章只節選了簡單的,好玩的,古老的,有實際講解意義的去重方法,除了去重的實現以外,我還將和您分享這其中的其他細節和拓展。 您或許不理解,為什麼只有五種? 當然,我 ...
  • 摘要:本文帶大家學習一下關於CSS屬性的繼承。 本文分享自華為雲社區《關於CSS有哪些屬性可以繼承?》,作者:黛琳ghz。 前言 今天遇到一個很有意思的題目,通過題目可以順便學習一下關於CSS屬性的繼承。(答案是ACD) 關於CSS屬性繼承 字體系列屬性 font:組合字體font-family:規 ...
  • #1、安裝 highcharts npm install highcharts --save #2、頁面引用 // 引入 import Highcharts from 'highcharts/highcharts-gantt.src.js' // 引入拖拽 import factory from ' ...
  • 回顧第一篇文章中談到的組件庫的幾個方面,只剩下最後的、也是最重要的組件庫的打包構建、本地發佈、遠程發佈了。 1 組件庫構建 組件庫的入口是 packages/yyg-demo-ui,構建組件庫有兩個步驟: 添加 TypeScript 的配置文件: tsconfig.json 添加 vite.conf ...
  • 任務平臺是科技內各業務方開展互動玩法的中心化平臺,支撐科技內拉新、促活、交易等業務場景,包含基礎任務、基於任務的通用活動玩法和業務投放能力。提供了任務玩法的創建、投放、曝光、完成等全生命周期的精細化管理,打造了基於任務的裂變、時間軸等通用活動玩法的規則化運營,致力於提升在多場景、多玩法、多頻次的業務... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...