驗證以及國際化 1.概述 (1)概述 對於輸入的數據(比如表單數據),進行必要的驗證,並給出相應的提示信息 對於驗證表單數據,SpringMVC 提供了很多使用的註解,這些註解由 JSR 303驗證框架提供。 (2)JSR 303 驗證框架 JSR 303 是 Java 為 Bean 數據合法性校驗 ...
1. 設計原則
1.1. 將所有你願意接受的作為參數的函數可能帶來的副作用以文檔的方式記錄下來
1.2. 最理想的情況下你接收的函數參數應該沒有任何副作用
1.3. 延遲數據結構是強力武器
1.4. 所有使用持久化數據結構的用戶都必須遵守“不修改”原則
2. 一等函數
2.1. first-class function
2.2. 能夠像普通變數一樣使用的函數
2.2.1. 可以作為參數傳遞
2.2.2. 可以作為結果返回
2.2.3. 能存儲在數據結構中的函數
2.3. ::操作符
2.3.1. 創建一個方法引用,像使用函數值一樣使用方法
2.4. Lambda表達式
2.4.1. 直接表示方法的值
3. 高階函數
3.1. higher-order function
3.2. 接受至少一個函數作為參數
3.3. 返回的結果是一個函數
3.4. 滿足任一要求
3.4.1. comparing
3.4.2. andThen
3.4.3. compose
4. 柯里化
4.1. 幫助你模塊化函數和重用代碼的技術
4.2. 將具備兩個參數(比如,x和y)的函數f轉化為使用一個參數的函數g,並且這個函數的返回值也是一個函數,它會作為新函數的一個參數
4.3. 後者的返回值和初始函數的返回值相同,即f(x, y) = (g(x))(y)
5. 部分求值
5.1. partially applied
5.2. 當一個函數使用的所有參數僅有部分(少於函數的完整參數列表)被傳遞時
6. 持久化數據結構
6.1. 數據結構的值始終保持一致,不受其他部分變化的影響
6.2. final只能應用於類的欄位,無法應用於它指向的對象,如果你想要對對象進行保護,則需要將其中的欄位聲明為final,以此類推
6.3. 在其被修改之前會對自身前一個版本的內容進行備份
6.4. 能避免不必要的防禦式複製
7. 資料庫中的持久化
7.1. 生命周期比程式的執行周期更長的數據
8. 函數式更新
8.1. 禁止使用帶有副作用的方法
8.2. 沒有改動任何現存的數據結構
8.3. 會導致過度的對象複製
9. fupdate
9.1. 純函數式
9.2. 會創建一個新的樹,並將其作為結果返回,通過參數的方式實現共用
10. update
10.1. 每一個update的用戶都希望共用同一份數據結構,也希望能瞭解程式任何部分所做的更新
11. 延遲計算
11.1. 無法聲明一個遞歸的Stream,因為Stream僅能使用一次
11.1.1. 一旦你對Stream執行一次終端操作調用,它就永久地終止了
11.2. 如果它們能讓程式設計更簡單,就儘量使用它們
11.3. 如果它們會帶來無法接受的性能損失,就嘗試以更加傳統的方式重新實現它們
11.4. 可以通過輔助方法(supplier)即時地創建列表中的元素
11.4.1. 輔助方法能幫忙創建更多的數據結構
12. 結合器
12.1. 函數式的思想
12.2. 將兩個或多個函數或者數據結構進行合併
12.3. 接受兩個或多個方法(函數)做參數且返回結果是另一個函數的方法
13. 記憶表
13.1. memoizatio)
13.2. 為方法添加一個封裝器,在其中加入一塊緩存
13.3. 遵守“引用透明性”原則的函數,其計算結構可以進行緩存
14. 引用透明性原則
14.1. 使用相同的參數產生同樣的結果
14.2. 使用equal對數據結構值進行比較
15. 模式匹配
15.1. 函數式的特性
15.1.1. 能幫助解包數據類型
15.1.2. 訪問者模式
15.1.3. Java語言中switch語句的一種泛化
15.2. 模式匹配為操縱類樹型數據結構提供了一個極其詳細又極富表現力的方式
15.2.1. Scala是面向表達式的
15.2.2. 可以避免出現大量嵌套的switch或者if-then-else語句和欄位選擇操作相互交織的情況
15.2.3. Java的switch和if-then-else無法完全實現模式匹配的思想
15.3. 用Lambda,原則上你的代碼里不應該使用if-then-else
15.3.1. 方法調用
15.3.1.1. myIf(condition, () -> e1, () -> e2);
15.3.1.2.
static <T> T myIf(boolean b, Supplier<T> truecase, Supplier<T> falsecase)
{
return b ? truecase.get() : falsecase.get();
}