讀函數式編程思維筆記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
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...