成为Java流大师–第1部分:创建流
在許多情況下,聲明性代碼(例如,具有Streams的功能組合)可提供出色的代碼指標。 通過本動手實驗文章系列進行編碼,并成為Java Streams的主教練,從而成為一名更好的Java程序員。
Streams的整個想法是代表一個數(shù)據(jù)流經(jīng)的管道,并且管道的功能將對數(shù)據(jù)進行操作。 這樣,可以表達對元素流的功能風格的操作。 本文是五分之一的內(nèi)容,您將直接學習如何成為流大師。 我們從基本的流示例開始,然后進行更復雜的任務,直到您知道如何將標準Java流連接到Cloud中的數(shù)據(jù)庫。
Streams的整個想法是代表一個數(shù)據(jù)流經(jīng)的管道,并且管道的功能將對數(shù)據(jù)進行操作。 這樣,可以表達對元素流的功能風格的操作。 本文是五分之一的內(nèi)容,您將直接學習如何成為流大師。 我們從基本的流示例開始,然后進行更復雜的任務,直到您知道如何將標準Java流連接到Cloud中的數(shù)據(jù)庫。
完成所有五篇文章之后,您將能夠大幅度減少代碼庫,并知道如何在一瞬間為整個應用程序編寫純Java代碼。
這是即將發(fā)表的文章的摘要:
- 第1部分: 創(chuàng)建流
- 第2部分: 中級操作
- 第三部分:終端操作
- 第4部分:數(shù)據(jù)庫流
- 第5部分:使用流創(chuàng)建數(shù)據(jù)庫應用程序
由于我們堅信“邊做邊學”的概念,因此該系列由GitHub存儲庫進行了補充,該存儲庫包含分為5個單元的Stream練習–每個單元對應于文章的主題。 README文件中提供了有關如何使用源代碼的說明。
什么是Java流?
Java Stream接口最初是在Java 8中引入的,并且與lambda一起成為Java開發(fā)的里程碑,因為它極大地促進了聲明性(功能性)編程風格。 如果您想了解更多有關聲明式編碼的優(yōu)勢,請參考本文 。
可以將Java Stream可視化為數(shù)據(jù)流經(jīng)的管道(請參見下圖)。 管道的功能將通過例如過濾,映射和分類項目來對數(shù)據(jù)進行操作。 最后,可以執(zhí)行終端操作以收集首選數(shù)據(jù)結構(例如
List , Array或Map 。 需要注意的重要一點是,流只能使用一次。
流管道包含三個主要部分; 流源,中間操作(零到很多)和終端操作。
讓我們看一個例子,以了解我們將在整個系列中教的內(nèi)容。 我們鼓勵您看下面的代碼,并嘗試在閱讀下一段之前弄清楚打印語句的結果。
List <String> list = Stream.of("Monkey", "Lion", "Giraffe","Lemur").filter(s -> s.startsWith("L")).map(String::toUpperCase).sorted().collect(toList()); System.out.println(list);由于Stream API具有描述性,并且通常使用起來非常直觀,因此無論您之前是否遇到過這些操作,您都可能會對這些操作的含義有很好的了解。 我們從包含四個字符串的List流開始,每個字符串代表非洲動物。 然后,這些操作會過濾出以字母“ L”開頭的元素,將其余元素轉(zhuǎn)換為大寫字母,然后以自然順序(在這種情況下表示字母順序)對其進行排序,最后將它們收集到List 。 因此,產(chǎn)生輸出[“LEMUR”, “LION”] 。
重要的是要理解,流是“惰性的”,即終端操作是“請求”元素的(在這種情況下,
.collect()語句)。 如果終端操作僅需要一個元素(例如,終端操作.findFirst() ),則最多.findFirst()有一個元素到達終端操作,并且提醒元素(如果有的話)將永遠不會產(chǎn)生資源。 這也意味著僅創(chuàng)建Stream通常是一種便宜的操作,而消耗它可能會很昂貴,具體取決于流管道和流中潛在元素的數(shù)量。
在這種情況下,流源是一個List盡管許多其他類型也可以充當數(shù)據(jù)源。 我們將在本文的其余部分中介紹一些最有用的源替代方法。
流主要適合于處理對象的集合,并且可以對任何類型T元素進行操作。 盡管存在三種特殊的Stream實現(xiàn); IntStream , LongStream和DoubleStream只能處理相應的原始類型。
可以通過以下方式調(diào)用Stream.empty()來生成任何這些類型的空Stream:
Stream <T> Stream.empty() IntStream IntStream.empty() LongStream LongStream.empty() DoubleStream DoubleStream.empty()在某些情況下,空流確實很方便,但是大多數(shù)時候,我們有興趣用元素填充流。 這可以通過許多方式來實現(xiàn)。 我們將首先研究IntStream的特殊情況,因為它提供了多種有用的方法。
一個基本情況是在少量項目上生成流。 這可以通過使用IntStream.of()列出整數(shù)來完成。 下面的代碼產(chǎn)生元素1、2和3的簡單流。
IntStream oneTwoThree = IntStream.of(1, 2, 3);如果項目數(shù)量增加,手動列出所有元素可能很乏味。 如果我們對某個范圍內(nèi)的值感興趣,則命令.rangeClosed()更有效。 該操作包含所有內(nèi)容,這意味著以下代碼將生成從1到9的所有元素的流。
IntStream positiveSingleDigits = IntStream.rangeClosed( 1 , 9 );.iterate()甚至是更強大的命令,它可以在包含哪些數(shù)字方面提供更大的靈活性。 下面,我們顯示一個示例,說明如何使用它來生成具有2的冪的所有數(shù)字的Stream。
IntStream powersOfTwo = IntStream.iterate( 1 , i -> i * 2 ); 還有幾種可能更意外的方式來生成Stream。 chars()方法可用于流式處理
String ,在這種情況下為元素“ A”,“ B”和“ C”。
還有一種生成隨機整數(shù)流的簡單方法。
IntStream randomInts = new Random().ints();流現(xiàn)有數(shù)據(jù)收集是另一種選擇。 我們可以流式傳輸現(xiàn)有Array的元素,或者選擇使用Stream.of()手動列出項目,如前所示并在下面重復。
String[] array = {"Monkey", "Lion", "Giraffe", "Lemur"}; Stream <String> stream2 = Stream.of(array);Stream <String> stream = Stream.of("Monkey", "Lion", "Giraffe", "Lemur"); 流任何Collection也是非常簡單的。 下面的示例演示如何使用簡單命令流式傳輸List或Set
.stream() 。
有時,流式傳輸文本文件的內(nèi)容也很有用。 以下命令將提供一個Stream ,將引用文件中的每一行作為單獨的元素保存。
Stream <String> lines = Files.lines(Paths.get("file.txt"));現(xiàn)在,我們已經(jīng)使您熟悉了創(chuàng)建Stream的一些方法,我們鼓勵您克隆此GitHub存儲庫并開始練習。 本文的內(nèi)容足以解決第一個稱為“創(chuàng)建”的單元。 Unit1Create接口包含JavaDocs,它們描述了Unit1MyCreate方法的預期實現(xiàn)。
public interface Unit1Create {/*** Creates a new Stream of String objects that contains* the elements "A", "B" and "C" in order.** @return a new Stream of String objects that contains* the elements "A", "B" and "C" in order*/Stream <String> newStreamOfAToC();提供的測試(例如Unit1MyCreateTest)將充當自動評分工具,讓您知道您的解決方案是否正確。
如果尚未這樣做,請繼續(xù)解決Unit1MyCreate類中的工作項。 “需要把他們?nèi)甲サ健薄?
在下一篇文章中,我們將繼續(xù)描述可應用于這些Stream并將它們轉(zhuǎn)換為其他Stream的幾種中間操作。 再見!
翻譯自: https://www.javacodegeeks.com/2019/10/become-a-master-of-java-streams-creating-streams.html
總結
以上是生活随笔為你收集整理的成为Java流大师–第1部分:创建流的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑库存图片(电脑仓库图片大全)
- 下一篇: ddos高防价格(抗ddos产品硬件多少