在Java8中構(gòu)建Stream流的多種方式詳解
在 Java 8 中引入的 Stream
流為我們提供了一種更加簡(jiǎn)潔和靈活的方式來(lái)處理數(shù)據(jù)。上述情況都是流對(duì)集合進(jìn)行操作的,但是對(duì)于流的創(chuàng)建操作還是不太了解,其實(shí)流的創(chuàng)建不止是使用集合進(jìn)行創(chuàng)建,還可以基于值、數(shù)組甚至是文件來(lái)構(gòu)建流,完成流操作。
構(gòu)建流的方法
在 Java 8 中,有多種方式可以構(gòu)建 Stream
流,使得數(shù)據(jù)處理變得更加便捷。以下是一些常見(jiàn)的構(gòu)建流的方法:
1. 從集合創(chuàng)建流: 使用集合的 stream()
方法可以直接創(chuàng)建流,使得集合中的元素可以流式操作。
2. 從數(shù)組創(chuàng)建流: 使用 Arrays.stream()
方法從數(shù)組中創(chuàng)建流。
3. 靜態(tài)工廠方法: Stream
接口提供了一些靜態(tài)工廠方法,如 Stream.of()
、Stream.iterate()
和 Stream.generate()
。
4. 使用 Stream.Builder
: 使用 Stream.Builder
逐個(gè)添加元素,構(gòu)建流。
5. 從文件創(chuàng)建流: 使用 Files.lines()
方法從文件中創(chuàng)建流,每行都是流中的一個(gè)元素。
從集合創(chuàng)建流
import java.util.Arrays; import java.util.List; import java.util.stream.Stream; public class CollectionToStreamExample { public static void main(String[] args) { List<String> fruits = Arrays.asList("apple", "banana", "orange", "grape", "kiwi"); Stream<String> stream = fruits.stream(); // 對(duì)流進(jìn)行操作,例如過(guò)濾、映射、歸約等 stream.filter(fruit -> fruit.length() > 5) .map(String::toUpperCase) .forEach(System.out::println); } }
在上述示例中,通過(guò) fruits.stream()
方法我們創(chuàng)建了一個(gè)包含水果的流。隨后,我們對(duì)流進(jìn)行了過(guò)濾(保留長(zhǎng)度大于 5 的水果)、映射(轉(zhuǎn)換成大寫)和終端操作(打印結(jié)果)。
從數(shù)組創(chuàng)建流
import java.util.stream.IntStream; public class ArrayToStreamExample { public static void main(String[] args) { int[] numbers = {1, 2, 3, 4, 5}; IntStream stream = Arrays.stream(numbers); // 對(duì)流進(jìn)行操作,例如過(guò)濾、映射、歸約等 stream.filter(num -> num % 2 == 0) .map(num -> num * num) .forEach(System.out::println); } }
在上述示例中,我們通過(guò) Arrays.stream(numbers)
方法從數(shù)組創(chuàng)建了一個(gè) IntStream
流。接著,我們對(duì)流進(jìn)行了過(guò)濾(保留偶數(shù))、映射(平方)和終端操作(打印結(jié)果)。
靜態(tài)工廠方法
使用 Stream
靜態(tài)工廠方法可以更加直觀地創(chuàng)建流,而無(wú)需手動(dòng)實(shí)現(xiàn)遍歷和創(chuàng)建元素的邏輯。這樣做不僅簡(jiǎn)化了代碼,還能讓你的意圖更加清晰,使代碼更具可讀性和可維護(hù)性。
- Stream.of(): 創(chuàng)建一個(gè)由指定元素組成的流。
Stream<String> stream = Stream.of("apple", "banana", "orange");
- Stream.iterate(): 生成一個(gè)無(wú)限流,通過(guò)迭代生成元素。
Stream<Integer> stream = Stream.iterate(1, n -> n * 2); // 1, 2, 4, 8, ...
- Stream.generate(): 生成一個(gè)無(wú)限流,通過(guò)提供的 Supplier 生成元素。
Stream<Double> stream = Stream.generate(Math::random); // 0.123..., 0.456..., ...
*使用 Stream.Builder
Stream.Builder
是一個(gè)用于逐步構(gòu)建流的輔助工具。通過(guò) add()
方法逐個(gè)添加元素,最后調(diào)用 build()
方法生成流.
import java.util.stream.Stream; public class StreamBuilderExample { public static void main(String[] args) { Stream.Builder<String> builder = Stream.builder(); builder.add("apple") .add("banana") .add("orange"); Stream<String> stream = builder.build(); stream.forEach(System.out::println); } }
在上述示例中,我們首先創(chuàng)建了一個(gè) Stream.Builder
對(duì)象。然后使用 add()
方法逐個(gè)添加水果元素。最后,通過(guò) build()
方法生成流并進(jìn)行遍歷輸出。
優(yōu)勢(shì)
使用 Stream.Builder
構(gòu)建流的主要優(yōu)勢(shì)在于靈活性。它允許你在構(gòu)建流的過(guò)程中動(dòng)態(tài)地添加元素,適用于那些元素來(lái)源不確定或需要?jiǎng)討B(tài)處理的場(chǎng)景。這種方式相比直接從集合或數(shù)組創(chuàng)建流,更加靈活且符合實(shí)際應(yīng)用需求。
從文件創(chuàng)建流
在 Java 8 中,使用 Stream
處理文件數(shù)據(jù)非常簡(jiǎn)便。通過(guò) Files.lines()
方法,你可以輕松地將文件的每一行轉(zhuǎn)換為一個(gè)流元素,從而對(duì)文件內(nèi)容進(jìn)行各種操作。
import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.stream.Stream; public class FileToStreamExample { public static void main(String[] args) { String filePath = "data.txt"; try (Stream<String> lines = Files.lines(Paths.get(filePath))) { // 對(duì)每一行數(shù)據(jù)進(jìn)行操作 lines.filter(line -> line.contains("Java")) .forEach(System.out::println); } catch (IOException e) { e.printStackTrace(); } } }
在上述示例中,我們使用 Files.lines()
方法從指定文件中創(chuàng)建了一個(gè)流。隨后,我們對(duì)流進(jìn)行了過(guò)濾,只保留包含 "Java" 的行,并通過(guò)終端操作將結(jié)果打印出來(lái)。
優(yōu)勢(shì)
使用 Stream
處理文件數(shù)據(jù)的優(yōu)勢(shì)在于簡(jiǎn)潔性和可讀性。相比傳統(tǒng)的讀取文件并使用循環(huán)遍歷的方式,使用 Stream
可以更加清晰地表達(dá)數(shù)據(jù)處理邏輯,減少冗余的代碼。
結(jié)語(yǔ)
Stream
流為我們提供了一種更加簡(jiǎn)潔、靈活和函數(shù)式的方式來(lái)處理集合數(shù)據(jù)。通過(guò)不同的構(gòu)建方法,我們可以根據(jù)不同的數(shù)據(jù)源和需求創(chuàng)建流,并進(jìn)行各種操作。這種流式操作的編程方式不僅提高了代碼的可讀性和可維護(hù)性,還能夠有效地利用多核處理器進(jìn)行并行處理,提高程序的性能。希望本篇能夠幫助你更好地理解如何基于 Stream
構(gòu)建流,為數(shù)據(jù)處理帶來(lái)更大的便捷和效率。
以上就是在Java8中構(gòu)建Stream流的多種方式詳解的詳細(xì)內(nèi)容,更多關(guān)于Java8 Stream流的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(53)
下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你2021-08-08java實(shí)現(xiàn)寫入并保存txt文件的代碼詳解
在本篇文章里小編給大家整理了關(guān)于java實(shí)現(xiàn)寫入并保存txt文件的代碼實(shí)例內(nèi)容,需要的朋友們可以參考學(xué)習(xí)下。2020-02-02Java編程實(shí)現(xiàn)時(shí)間和時(shí)間戳相互轉(zhuǎn)換實(shí)例
這篇文章主要介紹了什么是時(shí)間戳,以及Java編程實(shí)現(xiàn)時(shí)間和時(shí)間戳相互轉(zhuǎn)換實(shí)例,具有一定的參考價(jià)值,需要的朋友可以了解下。2017-09-09在X分鐘內(nèi)學(xué)會(huì)C#的入門簡(jiǎn)明教程
C#是一個(gè)優(yōu)雅的、類型安全的面向?qū)ο笳Z(yǔ)言。使用C#,開(kāi)發(fā)者可以在.NET框架下構(gòu)建安全而強(qiáng)大的應(yīng)用程序,閱讀本文可以快速的入門C#編程語(yǔ)言,需要的朋友可以參考下2014-03-03intellij idea修改maven配置時(shí)總是恢復(fù)默認(rèn)配置的解決方法idea版本(2020.2.x)
這篇文章主要介紹了intellij idea修改maven配置時(shí)總是恢復(fù)默認(rèn)配置的解決方法idea版本(2020.2.x),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08Java 手動(dòng)解析不帶引號(hào)的JSON字符串的操作
這篇文章主要介紹了Java 手動(dòng)解析不帶引號(hào)的JSON字符串的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10