爆!Java高級特性之Stream API詳解

爆!Java高級特性之Stream API詳解

Java 8引入的Stream API可以說是一個革命性的特性,讓我們告別了又臭又長的for循環,迎來了函數式編程的春天。今天就讓我們來一起深入了解這個讓人又愛又恨的Stream API吧!

什么是Stream?

Stream就像一個高級的迭代器,允許我們以聲明式方式處理數據集合。它可以讓我們用一種類似SQL查詢的方式來操作Java對象。Stream API結合了函數式編程的概念,大大簡化了集合操作。

簡單來說,Stream就是數據流。我們可以imagin它就像一條傳送帶,在上面放上要處理的元素,然后讓它流過一系列的操作。

創建Stream

創建Stream的方式有很多,我們來看幾種常見的:

  1. 從Collection創建
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();
  1. 從數組創建
String[] arr = {"a", "b", "c"};
Stream<String> stream = Arrays.stream(arr);
  1. 使用Stream.of()
Stream<String> stream = Stream.of("a", "b", "c");
  1. 生成無限流
Stream<Integer> infiniteStream = Stream.iterate(0, n -> n + 2);

看到這里,有些同學可能會說:"這有什么了不起的?我用for循環一樣可以啊!"別急,好戲才剛剛開始。

Stream操作

Stream API提供了豐富的中間操作和終端操作,讓我們可以方便地對數據進行各種轉換和匯總。

中間操作

中間操作會返回一個新的Stream,我們可以將多個中間操作連接起來形成一個查詢。常見的中間操作包括:

  1. filter: 過濾元素
Stream<String> filtered = stream.filter(s -> s.startsWith("a"));
  1. map: 轉換元素
Stream<String> mapped = stream.map(String::toUpperCase);
  1. flatMap: 將流中的每個元素轉換為一個流,然后把所有流連接起來
Stream<String> flatMapped = stream.flatMap(s -> Arrays.stream(s.split("")));
  1. distinct: 去重
Stream<String> distinct = stream.distinct();
  1. sorted: 排序
Stream<String> sorted = stream.sorted();
  1. peek: 對每個元素執行操作并返回一個新的Stream
Stream<String> peeked = stream.peek(System.out::println);

終端操作

終端操作會遍歷流以生成一個結果或副作用。在終端操作之后,流就被使用"光"了,無法再被操作。常見的終端操作包括:

  1. forEach: 遍歷每個元素
stream.forEach(System.out::println);
  1. count: 返回流中元素的個數
long count = stream.count();
  1. collect: 將流轉換為其他形式
List<String> list = stream.collect(Collectors.toList());
  1. reduce: 將流中元素組合起來
Optional<String> reduced = stream.reduce((s1, s2) -> s1 + s2);
  1. anyMatch, allMatch, noneMatch: 匹配操作
boolean anyStartsWithA = stream.anyMatch(s -> s.startsWith("a"));
  1. findFirst, findAny: 查找操作
Optional<String> first = stream.findFirst();

看到這里,有些同學可能會說:"哇,這么多操作,我腦子都暈了!"別擔心,讓我們來看一個實際的例子,你就會發現Stream API有多香了。

實戰案例

假設我們有一個Person類:

class Person {String name;int age;// 構造函數、getter和setter省略
}

現在我們有一個List<Person>,我們想要找出所有年齡大于18歲的人的名字,按字母順序排序,并且只取前3個。用傳統的方式,我們可能會這樣寫:

List<String> result = new ArrayList<>();
for (Person p : persons) {if (p.getAge() > 18) {result.add(p.getName());}
}
Collections.sort(result);
if (result.size() > 3) {result = result.subList(0, 3);
}

看起來不算太糟?那讓我們來看看用Stream API怎么寫:

List<String> result = persons.stream().filter(p -> p.getAge() > 18).map(Person::getName).sorted().limit(3).collect(Collectors.toList());

怎么樣?是不是感覺整個世界都清爽了?這就是Stream API的魅力所在!它讓我們的代碼更加簡潔、易讀,而且更加聲明式。我們告訴程序"我們想要什么",而不是"怎么去做"。

性能考慮

說到這里,可能有些同學會問:“Stream這么好用,是不是意味著我們應該到處使用它?”

嗯…這個問題問得好!雖然Stream API非常強大,但它并不是萬能的。在某些情況下,傳統的迭代可能會更快。特別是當我們處理的是基本類型(如int, long)時,使用Stream可能會帶來裝箱和拆箱的開銷。

另外,Stream的延遲執行特性也是把雙刃劍。它可以幫我們優化操作,避免不必要的計算。但如果使用不當,也可能導致性能問題。比如:

Stream<Integer> stream = Stream.iterate(0, i -> i + 1);
stream.filter(i -> i % 2 == 0).map(i -> i * 2).limit(10).forEach(System.out::println);

這段代碼看起來沒什么問題,但實際上它的效率并不高。因為iterate生成的是一個無限流,filtermap操作會被反復執行,直到找到10個符合條件的元素。

一個更高效的寫法是:

Stream.iterate(0, i -> i + 2).map(i -> i * 2).limit(10).forEach(System.out::println);

這樣我們就避免了不必要的過濾操作。

并行流

Stream API的另一個強大特性是可以輕松地實現并行處理。只需要調用parallel()方法,就可以將串行流轉換為并行流:

List<String> result = persons.parallelStream().filter(p -> p.getAge() > 18).map(Person::getName).sorted().limit(3).collect(Collectors.toList());

看起來很誘人是不是?但請記住,并行并不總是更快。在數據量較小或者操作較簡單的情況下,并行處理的開銷可能會超過其帶來的收益。所以在使用并行流之前,一定要進行充分的測試和基準比較。

總結

Stream API無疑是Java 8中最重要的特性之一。它為我們提供了一種新的數據處理方式,讓我們的代碼更加簡潔、易讀、高效。但就像所有的技術一樣,它也不是銀彈。我們需要理解它的工作原理,合理地使用它,才能真正發揮它的威力。

最后,送大家一句話:“Stream API很酷,但請記住,過度使用可能會導致代碼可讀性下降。保持簡單,保持清晰,這才是編程的真諦。”

好了,今天的課程就到這里。如果你覺得這篇文章對你有幫助,別忘了點贊收藏哦!下次我們再來探討其他Java高級特性。碼字不易,你的支持就是我創作的動力!

海碼面試 小程序

包含最新面試經驗分享,面試真題解析,全棧2000+題目庫,前后端面試技術手冊詳解;無論您是校招還是社招面試還是想提升編程能力,都能從容面對~

好了,今天的課程就到這里。如果你覺得這篇文章對你有幫助,別忘了點贊收藏哦!下次我們再來探討其他Java高級特性。碼字不易,你的支持就是我創作的動力!

海碼面試 小程序

包含最新面試經驗分享,面試真題解析,全棧2000+題目庫,前后端面試技術手冊詳解;無論您是校招還是社招面試還是想提升編程能力,都能從容面對~

[外鏈圖片轉存中…(img-TlNCRLSu-1720181315161)]

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/41352.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/41352.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/41352.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

分支與循環

目錄 1. if語句 1&#xff09;if 2) else 3&#xff09;分支中包含多條語句 4&#xff09;if嵌套 2.關系操作符 3.條件操作符 4.邏輯操作符&#xff1a;&& || ! 1) 邏輯取反運算符 !?編輯 2 與運算符?編輯 3) 或運算符?編輯 4) 閏年的判斷 5) 短路 …

LangChain 概述 (模塊索引)

文章目錄 一、下載二、核心功能1、流式傳輸 streaming 三、LCEL四、組成部分1、Promp template2、Example selectors (示例選擇器)3、Chat models (聊天模型)4、Messages (消息)5、LLMs (大語言模型) 一、下載 二、核心功能 其中包括以下內容&#xff1a; 從模型中返回結構化的…

若依 Vue 前端分離 3.8.8 版中生成的前端代碼中關于下拉框只有下拉箭頭的問題

生成代碼修改前 <el-form-item label"課程學科" prop"subject"><el-select v-model"queryParams.subject" placeholder"請選擇課程學科" clearable><el-optionv-for"dict in course_subject":key"dict…

Mysql中常用函數的使用示例

場景 基礎知識回顧&#xff1a;mysql中常用函數的使用示例。 注&#xff1a; 博客&#xff1a;霸道流氓氣質-CSDN博客 實現 數學函數 -- ABS(x)返回x的絕對值 SELECT ABS(-1),ABS(2); -- PI()返回圓周率 SELECT PI(); -- SQRT(x)返回非負數x的二次方根 SELECT SQRT(4); -…

【博士每天一篇文獻-算法】Adult neurogenesis acts as a neural regularizer

閱讀時間&#xff1a;2023-12-20 1 介紹 年份&#xff1a;2022 作者&#xff1a;Lina M. Tran&#xff0c;Adam Santoro&#xff0c;谷歌DeepMind 期刊&#xff1a; Proceedings of the National Academy of Sciences 引用量&#xff1a;13 代碼&#xff1a;https://github.c…

A4-C四驅高防輪式巡檢機器人

在當今數字化和智能化迅速發展的時代&#xff0c;旗晟智能帶來了一款革命性的創新產品——A4-C四驅高防輪式巡檢機器人。這款機器人以其卓越的性能和多功能性&#xff0c;為工業巡檢領域帶來了全新的解決方案。 一、產品亮點 1、四驅動力與高防護設計 四驅高防輪式巡檢機器人…

ASUS/華碩槍神4 G532L G732L系列 原廠win10系統 工廠文件 帶F12 ASUS Recovery恢復

華碩工廠文件恢復系統 &#xff0c;安裝結束后帶隱藏分區&#xff0c;一鍵恢復&#xff0c;以及機器所有驅動軟件。 系統版本&#xff1a;Windows10 原廠系統下載網址&#xff1a;http://www.bioxt.cn 需準備一個20G以上u盤進行恢復 請注意&#xff1a;僅支持以上型號專用…

GPT-2怎么做翻譯任務?

首先需要知道的是GPT-2無論在訓練還是推理過程都是只使用了transformer decoder&#xff0c;并沒有使用encoder結構&#xff0c;那么它是怎么做的翻譯任務呢&#xff1f; 使用transformer encoderdecoder的著名架構有&#xff1a; 最原始的transformer model&#xff08;Atte…

計算機應用數學--第一次作業

第一次作業計算題編程題 &#xff08;20分&#xff09; 第一次作業 計算題 &#xff08;20分&#xff09;求 E ( X ) E(X) E(X)&#xff0c; V a r ( X ) Var(X) Var(X) &#xff08;1&#xff09; X X X 服從 [ a , b ] [a,b] [a,b] 均勻分布。 &#xff08;2&#xff09;…

操作系統期末必考概念大綱(整理·全)

第一章 1、 操作系統的概念 2、 計算機發展的四個階段 3、 手工操作階段、批處理系統階段、多道程序系統階段、分時操作系統階段、通用操作系統階段 4、 批處理系統&#xff08;聯機、脫機&#xff09; 5、 操作系統的6個基本類型 6、 多道批處理特征 7、 分時系統特點 8、 算法…

第二節-K8s詞匯表

關鍵字詞匯表 https://kubernetes.io/zh-cn/docs/reference/glossary/?fundamentaltrue API Group (API 組)Kubernetes API 中的一組相關路徑。 API 服務器亦稱作:kube-apiserver API 服務器是 Kubernetes 控制平面的組件&#xff0c; 該組件負責公開了 Kubernetes API&…

2024年智慧教育與社會科學國際會議 (ICSSS 2024)

2024年智慧教育與社會科學國際會議 (ICSSS 2024) 2024 International Conference on Smart Education and Social Sciences 【重要信息】 大會地點&#xff1a;北京 大會官網&#xff1a;http://www.icicsss.com 投稿郵箱&#xff1a;icicssssub-conf.com 【注意&#xff1a;稿…

Stable-diffusion-WebUI 的API調用(內含文生圖和圖生圖實例)

前情提要 在之前嘗試使用Diffusers庫來進行stable-diffusion的接口調用以及各種插件功能實現&#xff0c;但發現diffusers庫中各復雜功能的添加較為麻煩&#xff0c;而且難以實現對采樣器的添加&#xff0c;safetensors格式模型的讀取。在官網上找到了webui有專門的api接口&am…

1117 數字之王

solution 判斷現有數字是否全為個位數 全為個位數&#xff0c;找出出現次數最多的數字&#xff0c;并首行輸出最多出現次數&#xff0c;第二行輸出所有出現該次數的數值不全為個位數 若當前位數值為0&#xff0c;無需處理若當前位數值非0&#xff0c;則每位立方相乘&#xff0…

10.x86游戲實戰-匯編指令lea

免責聲明&#xff1a;內容僅供學習參考&#xff0c;請合法利用知識&#xff0c;禁止進行違法犯罪活動&#xff01; 本次游戲沒法給 內容參考于&#xff1a;微塵網絡安全 工具下載&#xff1a; 鏈接&#xff1a;https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

Prometheus + Grafana 監控系統搭建使用指南-redis_exporter 安裝與配置

Redis 接入 Prometheus 監控系統 系列文章目錄 Prometheus 的安裝部署Grafana的安裝部署Linux服務器接入Prometheus監控-Node Exporter 安裝指南Prometheus 接入SpringBoot微服務監控Mysql 接入 Prometheus RocketMQ 接入Prometheus 監控ElasticSearch 接入 PrometheusNacos …

vue使用axios獲取信息的案例

List組件&#xff08;用來展示搜索的信息&#xff09; <template><div class"row"><!-- 列表數據 --><div class"card" v-for"user in info.users" :key"user.login" v-show"info.users.length">&l…

智慧校園-資產管理系統總體概述

智慧校園資產管理系統是面向教育機構設計的一體化數字平臺&#xff0c;其核心目標在于通過先進的信息技術手段&#xff0c;全面優化校園內部的資產管理流程。該系統致力于提升資產管理的效率與透明度&#xff0c;同時降低成本并確保所有操作符合財務及審計規范&#xff0c;為校…

Debezium系列之:單表多個tinyint(1)類型字段支持選擇字段轉化為int或者boolean

Debezium系列之:單表多個tinyint 1類型字段支持選擇字段轉化為int或者boolean 一、需求二、相關技術三、創建表和插入數據四、參數設置和字段選擇五、查看數據一、需求 單表中有多個tinyint(1)字段,需要能支持選擇某個字段類型轉化為int,某個字段類型轉化為boolean二、相關技…

RNN文獻綜述

循環神經網絡&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;是一種專門用于處理序列數據的神經網絡模型。它在自然語言處理、語音識別、時間序列預測等領域有著廣泛的應用。本文將從RNN的歷史發展、基本原理、應用場景以及最新研究進展等方面進行綜述。 歷…