讀函數式編程思維筆記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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...