當 Java SE 8(又名核心 Java 8)在 2014 年被推出時,它引入了一些更改,從根本上影響了用它進行的編程 。這些更改中有兩個緊密相連的部分:流 API 和函數式編程構造 。本文使用代碼示例,從基礎到高級特性,介紹每個部分并說明它們之間的相互作用 。
基礎特性 流 API 是在數據序列中迭代元素的簡潔而高級的方法 。包 java.util.stream 和 java.util.function 包含了用于流 API 和相關函數式編程構造的新庫 。當然,代碼示例勝過千言萬語 。
下面的代碼段用大約 2,000 個隨機整數值填充了一個 List:
Random rand = new Random2();List 另外用一個 for 循環可用于遍歷填充列表,以將偶數值收集到另一個列表中 。
流 API 提供了一種更簡潔的方法來執行此操作:
List 這個例子有三個來自流 API 的函數:
stream 函數可以將集合轉換為流,而流是一個每次可訪問一個值的傳送帶 。流化是惰性的(因此也是高效的),因為值是根據需要產生的,而不是一次性產生的 。filter 函數確定哪些流的值(如果有的話)通過了處理管道中的下一個階段,即 collect 階段 。filter 函數是 高階的(higher-order),因為它的參數是一個函數 —— 在這個例子中是一個 lambda 表達式,它是一個未命名的函數,并且是 Java 新的函數式編程結構的核心 。lambda 語法與傳統的 Java 完全不同:
n -> (n & 0x1) == 0 箭頭(一個減號后面緊跟著一個大于號)將左邊的參數列表與右邊的函數體分隔開 。參數 n 雖未明確類型,但也可以明確 。在任何情況下,編譯器都會發現 n 是個 Integer 。如果有多個參數,這些參數將被括在括號中,并用逗號分隔 。
在本例中,函數體檢查一個整數的最低位(最右)是否為零,這用來表示偶數 。過濾器應返回一個布爾值 。盡管可以,但該函數的主體中沒有顯式的 return 。如果主體沒有顯式的 return,則主體的最后一個表達式即是返回值 。在這個例子中,主體按照 lambda 編程的思想編寫,由一個簡單的布爾表達式 (n & 0x1) == 0 組成 。
collect 函數將偶數值收集到引用為 evens 的列表中 。如下例所示,collect 函數是線程安全的,因此,即使在多個線程之間共享了過濾操作,該函數也可以正常工作 。方便的功能和輕松實現多線程 在生產環境中,數據流的源可能是文件或網絡連接 。為了學習流 API, Java 提供了諸如 IntStream 這樣的類型,它可以用各種類型的元素生成流 。這里有一個 IntStream 的例子:
猜你喜歡
- 教你使用這兩個excel自動排名函數 excel按分數高低排序怎么排
- believe in的用法解析 believein
- 解析void函數應用 void函數已有主體怎么解決
- 似shi和si的用法 似的多音字
- apply的用法和搭配 call和apply的區別是什么
- Excel做復利終值系數表 excel復利計算函數
- 初中二次函數的圖象與性質 二次函數判別式的意義
- left函數用法與理解 left函數
- 常用函數匯總學習 mysql絕對值函數
- java字符串截取方法 java字符串分割函數
