讀函數式編程思維筆記05_現實應用

来源:https://www.cnblogs.com/lying7/archive/2023/01/24/17065781.html
-Advertisement-
Play Games

測試網站是本人學校,費話不多說下麵開始 首先直接導庫,過程中需要時間戳,rsa加密 import requests import re import time from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_v1_5 ...


1. Java 8

1.1. 除了增加函數式特性,還增加了一些配合使用的語法糖衣

1.2. 函數式介面

1.2.1. SAM(Single Abstract Method,單抽象方法)介面

1.2.1.1. 含有單一方法的介面是Java的一種習慣用法

1.2.1.2. Runnable和Callable介面都是有代表性的例子

1.2.2. 對舊有SAM介面的增強,它允許我們用lambda塊取代傳統的匿名類來就地實例化一個介面

1.3. 預設方法

1.3.1. 一些在介面類型中聲明的,以default關鍵字標記的,非抽象、非靜態的public方法(且帶有方法體定義)

1.4. mixin

1.4.1. 介於介面和父類之間的一種結構

1.4.2. 和介面一樣都是類型,都可以執行instanceof檢查,也都遵循一樣的擴展規則

1.4.3. Ruby、Groovy等類似語言也允許通過mixin的形式,在既有的類層次上增補功能

1.5. Optional類型

1.5.1. min()等內建方法都不直接返回結果值,而是返回一個Optional結構

1.5.2. 提供了ifPresent()方法,可以用在終結操作的位置上,設定在僅當存在有效結果時執行的一個代碼塊

1.6. stream

1.6.1. 不存儲值,只擔當從輸入源引出的管道角色,一直連接到終結操作上產生輸出

1.6.2. 儘可能做到緩求值

1.6.3. 可以沒有邊界(無限長)

1.6.3.1. 用limit()、findFirst()等方法來取得其一部分子集

1.6.4. 用過之後必須重新生成新的stream才能再次操作

1.6.4.1. 消耗品

1.6.5. 操作分類

1.6.5.1. 中間操作

1.6.5.1.1. 一律返回新的stream,並且總是緩求值的

1.6.5.2. 終結操作

1.6.5.2.1. 遍歷stream,產生結果值和副作用

2. 函數式的基礎設施

2.1. 架構

2.1.1. 架構永遠是取捨的結果

2.1.2. 從根本上貫徹“值不可變”的思路,最大化地發揮其優點

2.1.2.1. Java不允許字典型集合中的鍵在它被集合引用期間發生取值的變化,值不可變的對象完全符合這項要求

2.1.2.2. Groovy用語法糖衣掩蓋了實現值不可變性的繁瑣細節

2.1.2.2.1. 添加@Immutable標註

2.1.3. 測試是為了確認代碼中成功地製造了我們需要的變化

2.1.3.1. 測試的真正目的是對可變事物的檢驗——可變的事物越多,就需要越多的測試來保證其正確性

2.1.3.2. 可變的狀態越多,要求的測試也越多。

2.1.4. 值不可變的對象天生就是線程安全的,完全不會發生同步方面的問題

2.1.4.1. 具有原子性的失敗(failure atomicity):只要對象構造完畢,就不會再發生由值可變性引發的失敗

2.1.5. 實現一個值不可變的Java類

2.1.5.1. 把所有的欄位都標記為final

2.1.5.1.1. 要麼在聲明時初始化,要麼在構造器中初始化

2.1.5.2. 把類標記為final,防止被子類覆蓋

2.1.5.3. 不要提供無參數的構造器

2.1.5.3.1. 一個值不可變的對象,它的一切狀態都必須通過構造器來設定
2.1.5.3.2. 值不可變的類根本不應該出現無參數的構造器
2.1.5.3.2.1. 必須提供無參數的構造器,考慮用一個私有的無參數構造器來滿足框架的要求
2.1.5.3.2.2. 私有的構造器仍然可以通過反射來訪問

2.1.5.4. 提供至少一個構造器

2.1.5.5. 除了構造器之外,不要提供任何製造變化的方法

2.1.5.5.1. 標記了final的對象引用並不等於它所指向的一切都不可改變
2.1.5.5.2. 需要預防性地複製所有通過getXXX方法返回的對象引用

2.1.6. 命令-查詢職責隔離架構

2.1.6.1. (Command-Query Responsibility Segregation,CQRS)

2.1.7. 最終一致性(eventual consistency)

2.1.7.1. 不對模型的變更操作施加硬性的時間限制,而只是保證,當更新發生後,模型最終會回覆到一致的狀態

2.1.7.2. 事務要求系統滿足ACID(即原子性Atomic、一致性Consistent、隔離性Isolated、持久性Durable的縮寫)性質,而最終一致性要求滿足BASE(即基本可用Basically Available、軟狀態Soft state、最終一致性Eventual consistency的縮寫)性質

2.1.7.3. 讀取與變更分離之後,邏輯可得到簡化

2.1.7.3.1. 承擔讀取職責的部分可以全面實現值不可變的性質

2.2. Web框架

2.2.1. 整個Web看作是一系列從請求到響應的變換

2.2.1.1. Web領域與函數式編程簡直是天作之合

2.2.2. 路由框架

2.2.3. 以函數作為路由的目標

2.2.4. 領域專用語言(DSL)

2.2.4.1. 表達能力有限,專門針對一個狹窄問題域的電腦編程語言

2.2.4.2. 內部DSL是在其宿主語言之上構造出來的新“語言”,且利用宿主語言的語法糖衣來形成自身的風格

2.2.4.2.1. Ruby on Rails Web框架
2.2.4.2.2. C#語言的LINQ擴展

2.2.5. 與構建工具緊密集成

2.2.5.1. 和命令行的構建工具緊密集成,用構建工具來執行從生成新項目骨架到運行測試的一切任務

2.3. 資料庫

2.3.1. Datomic是一種值不可變的資料庫

2.3.1.1. 存儲值而非數據,它的空間利用效率並不低

2.3.1.2. 進入到庫里的每一筆事實都會被打上時間戳

2.3.1.3. 在信息上增加了時間的概念,使得每一筆事實都總是維持在正確的上下文里

2.3.1.4. 永久地記錄所有的schema變更和數據變更

2.3.1.5. 讀取和寫入分離

2.3.1.5.1. Datomic擁有一個CQRS系統的內在

2.3.1.6. 事件驅動型架構中的值不可變性和時間戳

2.3.1.6.1. 依靠一個事件流來反映應用程式的狀態變化,而一個捕獲所有信息並加上時間戳記的資料庫,正好可以完美地扮演事件流的角色,資料庫本身的特性即可滿足回退和重放事件的需求

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

-Advertisement-
Play Games
更多相關文章
  • flex佈局 -- 彈性盒模型 display: flex; 就會讓其變成彈性盒子 當把一個元素的 display 屬性設置為 flex 或者 inline-flex 後,它就成了一個容器。 flex 與 inline-flex 的關係就類似 block 與 inline-block 的關係,定義里 ...
  • 簡介: 組合模式,屬於結構型的設計模式。將對象組合成樹形結構以表示“部分-整體”的層次結構。組合模式使得用戶對單個對象和組合對象的使用具有一致性。 組合模式分兩種狀態: 透明方式,子類的所有介面一致,使其葉子節點和枝節點對外界沒有區別。 安全方式,子類介面不一致,只實現特定的介面。 適用場景: 希望 ...
  • AOP-02 4.問題提出 在上一篇的MyProxyProvider類中,我們的輸出語句功能比較弱,在實際開發中,我們希望是以一個方法的形式,嵌入到真正執行的目標方法前,怎麼辦? 1.使用土方法解決 需求分析:使用土方法解決前面的問題,後面使用spring的aop組件完成 改進MyProxyProv ...
  • 2023-01-24 一、搜索查找類命令 1、find命令 (1)find -name "*.txt" (功能描述:查找當前目錄下包含“.txt”的文件) 2、grep過濾查找及“|”管道符 管道符,“|”,表示將前一個命令的處理結果輸出傳遞給後面的命令處理 (1)ll | grep -n test ...
  • 前言 對於一個懶懶的,不想寫高精的人(就是我),每次都會遭遇到答案爆$long$ $long$的危險 比如說這道題: 題目傳送門 最後的$23-25$的兩個點,$long$ $long$甚至$unsigned$ $long$ $long$都無法滿足,難道真的要手打高精度了嗎? 不,我們有$\_$$\ ...
  • 2023-01-24 一、CentOS中的時間日期類命令 1、date顯示當前時間 (1)date (功能描述:顯示當前時間) (2)date + %Y (功能描述:顯示當前年份) (3)date + %m (功能描述:顯示當前月份) (4)date + %d (功能描述:顯示當前是哪一天) (5) ...
  • 2023-01-24 一、幫助命令 1、基本語法 man[命令或配置文件] 功能描述:獲得幫助信息 2、顯示說明 (1)NAME:命令的名稱和單行描述 (2)SYNOPSIS:怎樣使用命令 (3)DESCRIPTION:命令功能的深入討論 (4)EXAMPLES:怎樣使用命令的例子 (5)SEE A ...
  • 這篇文章主要關註服務發現,會討論基於DNS、VIP、ZooKeeper以及消息匯流排的服務發現機制,研究出在服務發現需要AP還是CP。 ...
一周排行
    -Advertisement-
    Play Games
  • 基於.NET Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...