讀函數式編程思維筆記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
  • 一個自定義WPF窗體的解決方案,借鑒了呂毅老師的WPF製作高性能的透明背景的異形視窗一文,併在此基礎上增加了滑鼠穿透的功能。可以使得透明窗體的滑鼠事件穿透到下層,在下層窗體中響應。 ...
  • 在C#中使用RabbitMQ做個簡單的發送郵件小項目 前言 好久沒有做項目了,這次做一個發送郵件的小項目。發郵件是一個比較耗時的操作,之前在我的個人博客裡面回覆評論和友鏈申請是會通過發送郵件來通知對方的,不過當時只是簡單的進行了非同步操作。 那麼這次來使用RabbitMQ去統一發送郵件,我的想法是通過 ...
  • 當你使用Edge等瀏覽器或系統軟體播放媒體時,Windows控制中心就會出現相應的媒體信息以及控制播放的功能,如圖。 SMTC (SystemMediaTransportControls) 是一個Windows App SDK (舊為UWP) 中提供的一個API,用於與系統媒體交互。接入SMTC的好 ...
  • 最近在微軟商店,官方上架了新款Win11風格的WPF版UI框架【WPF Gallery Preview 1.0.0.0】,這款應用引入了前沿的Fluent Design UI設計,為用戶帶來全新的視覺體驗。 ...
  • 1.簡單使用實例 1.1 添加log4net.dll的引用。 在NuGet程式包中搜索log4net並添加,此次我所用版本為2.0.17。如下圖: 1.2 添加配置文件 右鍵項目,添加新建項,搜索選擇應用程式配置文件,命名為log4net.config,步驟如下圖: 1.2.1 log4net.co ...
  • 之前也分享過 Swashbuckle.AspNetCore 的使用,不過版本比較老了,本次演示用的示例版本為 .net core 8.0,從安裝使用開始,到根據命名空間分組顯示,十分的有用 ...
  • 在 Visual Studio 中,至少可以創建三種不同類型的類庫: 類庫(.NET Framework) 類庫(.NET 標準) 類庫 (.NET Core) 雖然第一種是我們多年來一直在使用的,但一直感到困惑的一個主要問題是何時使用 .NET Standard 和 .NET Core 類庫類型。 ...
  • WPF的按鈕提供了Template模板,可以通過修改Template模板中的內容對按鈕的樣式進行自定義。結合資源字典,可以將自定義資源在xaml視窗、自定義控制項或者整個App當中調用 ...
  • 實現了一個支持長短按得按鈕組件,單擊可以觸發Click事件,長按可以觸發LongPressed事件,長按鬆開時觸發LongClick事件。還可以和自定義外觀相結合,實現自定義的按鈕外形。 ...
  • 一、WTM是什麼 WalkingTec.Mvvm框架(簡稱WTM)最早開發與2013年,基於Asp.net MVC3 和 最早的Entity Framework, 當初主要是為瞭解決公司內部開發效率低,代碼風格不統一的問題。2017年9月,將代碼移植到了.Net Core上,併進行了深度優化和重構, ...