最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java Stream流從入門到精通(最新整理)

 更新時間:2025年09月08日 15:47:52   作者:六七_(dá)Shmily  
Java Stream 是一個來自 java.util.stream 包的抽象概念,它允許你以聲明方式處理數(shù)據(jù)集合(例如 List、Set 等),本文給大家介紹Java Stream流從入門到精通,感興趣的朋友跟隨小編一起看看吧

Stream流,這是一個非常重要的里程碑。它代表了從“命令式編程”向“聲明式編程”風(fēng)格的轉(zhuǎn)變,剛開始不理解是非常正常的。

一、Stream是做什么的?—— “流水線”的比喻

你可以把Stream想象成一條工廠里的流水線。

  • 數(shù)據(jù)源(集合、數(shù)組等):就像是待加工的原材料,被放在流水線的開頭。
  • 零個或多個“中間操作” (Intermediate operations):就像是流水線上的一道道加工工序,比如篩選、轉(zhuǎn)換、排序等。這些工序不會立刻執(zhí)行,只是被定義出來。
  • 一個“終結(jié)操作” (Terminal operation):就像是流水線的最后一道工序,比如打包、裝箱。只有到了這一步,整個流水線才會被啟動,所有原材料才會依次經(jīng)過各個加工工序,最終產(chǎn)生結(jié)果。

Stream的核心思想是:你只需告訴它“做什么”(What),而不是“怎么做”(How)。

  • 傳統(tǒng)循環(huán)(命令式):你寫一個for循環(huán),自己處理迭代、定義臨時變量、寫if條件判斷。你是在指導(dǎo)計算機每一步該怎么執(zhí)行。
  • Stream流(聲明式):你直接說“幫我過濾出大于5的數(shù),然后轉(zhuǎn)換成字符串,最后排序并收集到一個列表里”。你只關(guān)心結(jié)果,而不關(guān)心內(nèi)部是如何遍歷和處理的。

舉個例子:有一個數(shù)字列表,找出所有偶數(shù),然后求它們的平方,最后收集到一個新列表里。

傳統(tǒng)方式(命令式):

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);
List<Integer> evenSquares = new ArrayList<>();
for (Integer number : numbers) {
    if (number % 2 == 0) {         // 自己寫if判斷
        int square = number * number; // 自己計算平方
        evenSquares.add(square);    // 自己添加到新集合
    }
}

Stream方式(聲明式):

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);
List<Integer> evenSquares = numbers.stream() // 1. 獲取流
        .filter(n -> n % 2 == 0)           // 2. “工序”一:過濾偶數(shù)
        .map(n -> n * n)                   // 3. “工序”二:映射為平方
        .collect(Collectors.toList());     // 4. “啟動”流水線:收集結(jié)果

你看,Stream的代碼更簡潔、更易讀,它的每一步操作都像在描述業(yè)務(wù)邏輯本身。

二、是任何類型都可以使用Stream嗎?

不是任何類型本身都能用,但任何類型的【集合】或【數(shù)組】幾乎都可以轉(zhuǎn)換成Stream來處理。

Stream流本身是一個通用工具,但它不能直接作用于單個對象(比如你有一個String name = "Alice",你不能name.stream())。它的操作對象是數(shù)據(jù)序列。

數(shù)據(jù)源主要來自以下幾個方面:

從集合(Collection)來(最常見)

List<String> list = Arrays.asList("a", "b", "c");
Stream<String> streamFromList = list.stream();
Set<Integer> set = new HashSet<>(Arrays.asList(1, 2, 3));
Stream<Integer> streamFromSet = set.stream();

所有Collection的實現(xiàn)類(List, Set, Queue等)都有.stream()方法。

從數(shù)組來

int[] numbers = {1, 2, 3, 4, 5};
IntStream streamFromArray = Arrays.stream(numbers); // 注意是IntStream

使用Arrays.stream(array)靜態(tài)方法。

使用Stream類的靜態(tài)方法

Stream<String> streamOfValues = Stream.of("Java", "Python", "C++");
// 創(chuàng)建一個無限的奇數(shù)流:1, 3, 5, 7...
Stream<Integer> infiniteStream = Stream.iterate(1, n -> n + 2);

Stream.of(T... values): 直接用值創(chuàng)建流。

Stream.iterate()Stream.generate(): 創(chuàng)建無限流。

從文件等I/O資源來(比如Files.lines()):

try (Stream<String> lines = Files.lines(Paths.get("file.txt"))) {
    lines.forEach(System.out::println);
}

特別注意:基本類型

直接操作基本類型(int, long, double)為了避免裝箱拆箱的性能損耗,Java提供了特化的流:IntStream, LongStream, DoubleStream

它們有額外的方法,如sum(), average(), range()等。

所以,結(jié)論是:你需要有一個數(shù)據(jù)序列(通常是集合或數(shù)組),然后就可以把它變成Stream來使用。

三、Stream的操作分類:中間操作 vs. 終結(jié)操作

這是理解Stream執(zhí)行機制的關(guān)鍵。Stream的操作分為兩大類:

類型特點常見方法返回值
中間操作懶惰的 (Lazy)filter(), map(), sorted(), distinct(), limit()返回一個新的Stream
不會立即執(zhí)行,只是被記錄下來flatMap(), peek()
終結(jié)操作積極的 (Eager)collect(), forEach(), count()返回一個非Stream的結(jié)果
會觸發(fā)整個流水線的實際執(zhí)行findFirst(), anyMatch(), reduce(), min()/max()(如void, List, Optional, int等)

執(zhí)行原理:只有在調(diào)用終結(jié)操作時,所有中間操作才會組合成一個“流水線方案”,然后數(shù)據(jù)源中的元素會逐個地依次通過整個流水線。這種處理方式稱為“循環(huán)融合”,效率很高,因為它只需要遍歷一次集合。

四、常用的Stream操作(“加工工序”)

  • filter(Predicate<? super T> predicate) - 過濾
    • 保留滿足條件的元素。Predicate是一個返回boolean的函數(shù)。
    • .filter(s -> s.length() > 3) // 保留長度大于3的字符串
  • map(Function<? super T, ? extends R> mapper) - 映射/轉(zhuǎn)換
    • 將元素轉(zhuǎn)換成另一種形式。Function是一個轉(zhuǎn)換函數(shù)。
    • .map(String::toUpperCase) // 將每個字符串轉(zhuǎn)為大寫
    • .map(n -> n * 2) // 將每個數(shù)字乘以2
  • sorted() / sorted(Comparator<? super T> comparator) - 排序
  • distinct() - 去重
  • limit(long maxSize) - 限制數(shù)量
  • collect(Collector<? super T, A, R> collector) - 收集(最常用的終結(jié)操作)
    • 將流中的元素收集到各種不同的容器中(如List, Set, Map)。
    • .collect(Collectors.toList())
    • .collect(Collectors.toSet())
    • .collect(Collectors.joining(", ")) // 連接成字符串
    • .collect(Collectors.groupingBy(User::getDepartment)) // 按部門分組

總結(jié)與建議

  • Stream是什么:一個用于高效處理數(shù)據(jù)序列(特別是集合)的聲明式API,遵循“流水線”模式。
  • 核心優(yōu)勢:代碼簡潔、可讀性強、易于并行化(只需將.stream()換成.parallelStream())。
  • 使用條件:數(shù)據(jù)源需要是集合、數(shù)組等可以生成序列的類型。
  • 關(guān)鍵機制:操作分為中間操作(懶惰,定義工序)和終結(jié)操作(積極,啟動執(zhí)行)。

給你的學(xué)習(xí)建議

  1. 多練習(xí)從ListArray創(chuàng)建流。
  2. 重點掌握filtermapcollect這三個最常用的方法。
  3. 理解每個中間操作都會返回一個新流,但不會觸發(fā)計算。
  4. 記住,沒有終結(jié)操作,整個Stream流水線就什么都不會做。

到此這篇關(guān)于Java Stream流:從入門到精通的文章就介紹到這了,更多相關(guān)Java Stream流內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java中靜態(tài)導(dǎo)入機制用法實例詳解

    java中靜態(tài)導(dǎo)入機制用法實例詳解

    這篇文章主要介紹了java中靜態(tài)導(dǎo)入機制用法實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • 聊聊注解@Aspect的AOP實現(xiàn)操作

    聊聊注解@Aspect的AOP實現(xiàn)操作

    這篇文章主要介紹了聊聊注解@Aspect的AOP實現(xiàn)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • Spring中常用注解的用法

    Spring中常用注解的用法

    這篇文章主要介紹了Spring中常用注解的用法,Spring注解方式減少了配置文件內(nèi)容,更加便于管理,并且使用注解可以大大提高了開發(fā)效率,注解本身是沒有功能的,和xml一樣,注解和xml都是一種元數(shù)據(jù),元數(shù)據(jù)即解釋數(shù)據(jù)的數(shù)據(jù),也就是所謂的配置,需要的朋友可以參考下
    2023-08-08
  • 一個MIDP俄羅斯方塊游戲的設(shè)計和實現(xiàn)

    一個MIDP俄羅斯方塊游戲的設(shè)計和實現(xiàn)

    一個MIDP俄羅斯方塊游戲的設(shè)計和實現(xiàn)...
    2006-12-12
  • Mybatis新手教程之簡單入門

    Mybatis新手教程之簡單入門

    這篇文章主要給大家介紹了關(guān)于Mybatis新手教程之簡單入門的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • Java中Optional.of()方法及源碼解析(非常詳細(xì)!)

    Java中Optional.of()方法及源碼解析(非常詳細(xì)!)

    這篇文章主要給大家介紹了關(guān)于Java中Optional.of()方法及源碼解析的相關(guān)資料,Java中java.util .Optional類的of()方法用于獲得該Optional類中具有指定類型的指定值的一個實例,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-06-06
  • Java中stream的用法詳細(xì)解讀

    Java中stream的用法詳細(xì)解讀

    這篇文章主要介紹了Java中stream的用法詳細(xì)解讀,Stream 是 Java8 中處理集合的關(guān)鍵抽象概念,它可以指定你希望對集合進(jìn)行的操作,可以執(zhí)行非常復(fù)雜的查找、過濾和映射數(shù)據(jù)等操作,使用Stream API 對集合數(shù)據(jù)進(jìn)行操作,就類似于使用SQL執(zhí)行的數(shù)據(jù)庫查詢,需要的朋友可以參考下
    2023-10-10
  • java 抓取網(wǎng)頁內(nèi)容實現(xiàn)代碼

    java 抓取網(wǎng)頁內(nèi)容實現(xiàn)代碼

    這篇文章主要介紹了java 抓取網(wǎng)頁內(nèi)容實現(xiàn)代碼,需要的朋友可以參考下
    2014-02-02
  • Java常用類之System類的使用指南

    Java常用類之System類的使用指南

    System類代表系統(tǒng),系統(tǒng)級的很多屬性和控制方法都放置在該類的內(nèi)部。該類位于java.lang包。本文將通過示例為大家詳細(xì)講講System類的使用,需要的可以參考一下
    2022-07-07
  • 基于Spring AMQP實現(xiàn)消息隊列的示例代碼

    基于Spring AMQP實現(xiàn)消息隊列的示例代碼

    Spring AMQP作為Spring框架的一部分,是一套用于支持高級消息隊列協(xié)議(AMQP)的工具,AMQP是一種強大的消息協(xié)議,旨在支持可靠的消息傳遞,本文給大家介紹了如何基于Spring AMQP實現(xiàn)消息隊列,需要的朋友可以參考下
    2024-03-03

最新評論

舒兰市| 大港区| 平罗县| 津市市| 丹凤县| 盐山县| 阳泉市| 上林县| 太仆寺旗| 化州市| 安阳县| 洪洞县| 镇坪县| 台州市| 尼玛县| 平顺县| 隆德县| 新疆| 绥中县| 宿州市| 增城市| 富源县| 龙岩市| 岳阳市| 安庆市| 将乐县| 云和县| 泾源县| 渝中区| 绥阳县| 安远县| 安庆市| 湄潭县| 枣庄市| 巴中市| 霍林郭勒市| 宜黄县| 房产| 车险| 万年县| 泸溪县|