讀函數式編程思維筆記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 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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...