Java_Stream流

一、JDK8新特性(Stream流)

接下來學習一個全新的知識,叫做Stream流(也叫Stream API)。它是從JDK8以后才有的一個新特性,是專業用于對集合或者數組進行便捷操作的。有多方便呢?我們用一個案例體驗一下,然后再詳細學習。
在這里插入圖片描述

1.1 Stream流體驗

案例需求:有一個List集合,元素有"張三豐","張無忌","周芷若","趙敏","張強",找出姓張,且是3個字的名字,存入到一個新集合中去。

List<String> names = new ArrayList<>();
Collections.addAll(names, "張三豐","張無忌","周芷若","趙敏","張強");
System.out.println(names);
  • 用傳統方式來做,代碼是這樣的
// 找出姓張,且是3個字的名字,存入到一個新集合中去。
List<String> list = new ArrayList<>();
for (String name : names) {if(name.startsWith("張") && name.length() == 3){list.add(name);}
}
System.out.println(list);
  • 用Stream流來做,代碼是這樣的(ps: 是不是想流水線一樣,一句話就寫完了)
List<String> list2 = names.stream().filter(s -> s.startsWith("張")).filter(a -> a.length()==3).collect(Collectors.toList());
System.out.println(list2);

先不用知道這里面每一句話是什么意思,具體每一句話的含義,待會再一步步學習。現在只是體驗一下。

學習Stream流我們接下來,會按照下面的步驟來學習。
在這里插入圖片描述

1.2 Stream流的創建

好,接下來我們正式來學習Stream流。先來學習如何創建Stream流、或者叫獲取Stream流。
在這里插入圖片描述

主要掌握下面四點:1、如何獲取List集合的Stream流?2、如何獲取Set集合的Stream流?3、如何獲取Map集合的Stream流?4、如何獲取數組的Stream流?

直接上代碼演示

/*** 目標:掌握Stream流的創建。*/
public class StreamTest2 {public static void main(String[] args) {// 1、如何獲取List集合的Stream流?List<String> names = new ArrayList<>();Collections.addAll(names, "張三豐","張無忌","周芷若","趙敏","張強");Stream<String> stream = names.stream();// 2、如何獲取Set集合的Stream流?Set<String> set = new HashSet<>();Collections.addAll(set, "劉德華","張曼玉","蜘蛛精","馬德","德瑪西亞");Stream<String> stream1 = set.stream();stream1.filter(s -> s.contains("德")).forEach(s -> System.out.println(s));// 3、如何獲取Map集合的Stream流?Map<String, Double> map = new HashMap<>();map.put("古力娜扎", 172.3);map.put("迪麗熱巴", 168.3);map.put("馬爾扎哈", 166.3);map.put("卡爾扎巴", 168.3);Set<String> keys = map.keySet();Stream<String> ks = keys.stream();Collection<Double> values = map.values();Stream<Double> vs = values.stream();Set<Map.Entry<String, Double>> entries = map.entrySet();Stream<Map.Entry<String, Double>> kvs = entries.stream();kvs.filter(e -> e.getKey().contains("巴")).forEach(e -> System.out.println(e.getKey()+ "-->" + e.getValue()));// 4、如何獲取數組的Stream流?String[] names2 = {"張翠山", "東方不敗", "唐大山", "獨孤求敗"};Stream<String> s1 = Arrays.stream(names2);Stream<String> s2 = Stream.of(names2);}
}

1.3 Stream流中間方法

中間方法指的是:調用完方法之后其結果是一個新的Stream流,于是可以繼續調用方法,這樣一來就可以支持鏈式編程(或者叫流式編程)。
在這里插入圖片描述

話不多說,直接上代碼演示

/*** 目標:掌握Stream流提供的常見中間方法。*/
public class StreamTest3 {public static void main(String[] args) {List<Double> scores = new ArrayList<>();Collections.addAll(scores, 88.5, 100.0, 60.0, 99.0, 9.5, 99.6, 25.0);// 需求1:找出成績大于等于60分的數據,并升序后,再輸出。scores.stream().filter(s -> s >= 60).sorted().forEach(s -> System.out.println(s));List<Student> students = new ArrayList<>();Student s1 = new Student("蜘蛛精", 26, 172.5);Student s2 = new Student("蜘蛛精", 26, 172.5);Student s3 = new Student("紫霞", 23, 167.6);Student s4 = new Student("白晶晶", 25, 169.0);Student s5 = new Student("牛魔王", 35, 183.3);Student s6 = new Student("牛夫人", 34, 168.5);Collections.addAll(students, s1, s2, s3, s4, s5, s6);// 需求2:找出年齡大于等于23,且年齡小于等于30歲的學生,并按照年齡降序輸出.students.stream().filter(s -> s.getAge() >= 23 && s.getAge() <= 30).sorted((o1, o2) -> o2.getAge() - o1.getAge()).forEach(s -> System.out.println(s));// 需求3:取出身高最高的前3名學生,并輸出。students.stream().sorted((o1, o2) -> Double.compare(o2.getHeight(), o1.getHeight())).limit(3).forEach(System.out::println);System.out.println("-----------------------------------------------");// 需求4:取出身高倒數的2名學生,并輸出。   s1 s2 s3 s4 s5 s6students.stream().sorted((o1, o2) -> Double.compare(o2.getHeight(), o1.getHeight())).skip(students.size() - 2).forEach(System.out::println);// 需求5:找出身高超過168的學生叫什么名字,要求去除重復的名字,再輸出。students.stream().filter(s -> s.getHeight() > 168).map(Student::getName).distinct().forEach(System.out::println);// distinct去重復,自定義類型的對象(希望內容一樣就認為重復,重寫hashCode,equals)students.stream().filter(s -> s.getHeight() > 168).distinct().forEach(System.out::println);Stream<String> st1 = Stream.of("張三", "李四");Stream<String> st2 = Stream.of("張三2", "李四2", "王五");Stream<String> allSt = Stream.concat(st1, st2);allSt.forEach(System.out::println);}
}

1.4 Stream流終結方法

最后,我們再學習Stream流的終結方法。這些方法的特點是,調用完方法之后,其結果就不再是Stream流了,所以不支持鏈式編程。

在這里插入圖片描述
在這里插入圖片描述

話不多說,直接上代碼

/*** 目標:Stream流的終結方法*/
public class StreamTest4 {public static void main(String[] args) {List<Student> students = new ArrayList<>();Student s1 = new Student("蜘蛛精", 26, 172.5);Student s2 = new Student("蜘蛛精", 26, 172.5);Student s3 = new Student("紫霞", 23, 167.6);Student s4 = new Student("白晶晶", 25, 169.0);Student s5 = new Student("牛魔王", 35, 183.3);Student s6 = new Student("牛夫人", 34, 168.5);Collections.addAll(students, s1, s2, s3, s4, s5, s6);// 需求1:請計算出身高超過168的學生有幾人。long size = students.stream().filter(s -> s.getHeight() > 168).count();System.out.println(size);// 需求2:請找出身高最高的學生對象,并輸出。Student s = students.stream().max((o1, o2) -> Double.compare(o1.getHeight(), o2.getHeight())).get();System.out.println(s);// 需求3:請找出身高最矮的學生對象,并輸出。Student ss = students.stream().min((o1, o2) -> Double.compare(o1.getHeight(), o2.getHeight())).get();System.out.println(ss);// 需求4:請找出身高超過170的學生對象,并放到一個新集合中去返回。// 流只能收集一次。List<Student> students1 = students.stream().filter(a -> a.getHeight() > 170).collect(Collectors.toList());System.out.println(students1);Set<Student> students2 = students.stream().filter(a -> a.getHeight() > 170).collect(Collectors.toSet());System.out.println(students2);// 需求5:請找出身高超過170的學生對象,并把學生對象的名字和身高,存入到一個Map集合返回。Map<String, Double> map =students.stream().filter(a -> a.getHeight() > 170).distinct().collect(Collectors.toMap(a -> a.getName(), a -> a.getHeight()));//把什么作為鍵,把什么作為值System.out.println(map);// Object[] arr = students.stream().filter(a -> a.getHeight() > 170).toArray();Student[] arr = students.stream().filter(a -> a.getHeight() > 170).toArray(len -> new Student[len]);System.out.println(Arrays.toString(arr));}
}

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

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

相關文章

【OAuth2】授權框架的四種授權方式詳解

&#x1f389;&#x1f389;歡迎來到我的CSDN主頁&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一個在CSDN分享筆記的博主。&#x1f4da;&#x1f4da; &#x1f31f;推薦給大家我的專欄《OAuth 2》。&#x1f3af;&#x1f3af; &#x1…

go從0到1項目實戰體系二十二:gin構建一個http server

1. 構建一個http server: // api.test.com/topic/main.go: type Topic struct {Id int // 如果寫成小寫的,不能訪問,因為是私有的.Title string } func main() {data : make(map[string]interface{})data["name"] "david"data["age"…

TwIST算法MALTLAB主程序詳解

TwIST算法MALTLAB主程序詳解 關于TwIST算法的具體原理可以參考&#xff1a; 鏈接: https://ieeexplore.ieee.org/abstract/document/4358846 鏈接: https://blog.csdn.net/jbb0523/article/details/52193209 該算法的MATLAB源代碼&#xff1a; 鏈接: http://www.lx.it.pt/~bi…

tcp和udp協議分別是什么意思有什么區別?

TCP&#xff08;傳輸控制協議&#xff09;和UDP&#xff08;用戶數據報協議&#xff09;是兩種網絡傳輸協議&#xff0c;它們在網絡通信中有一些關鍵的區別。 連接性&#xff1a; TCP&#xff1a; 提供面向連接的服務。在通信之前&#xff0c;需要建立連接&#xff0c;數據傳輸…

Node.js(二)-模塊化

1. 模塊化的基本概念 1.1 什么是模塊化 模塊化是指解決一個復雜問題時&#xff0c;自頂向下逐層將系統拆分成若干模塊的過程。對于整個系統來說&#xff0c;模塊是可組合、分解和更換的單元。 1.2 編程領域中的模塊化 編程領域中的模塊化&#xff0c;就是遵守固定的規則&…

48V轉12V 300mA降壓芯片,60V耐壓、0.6A穩壓芯片帶ECO模式-AH590L

AH590L是一種48V轉12V 300mA降壓芯片&#xff0c;具有60V耐壓、0.6A穩壓電流的特點&#xff0c;并且還帶有ECO模式&#xff0c;是一種理想的開關電源解決方案。 AH590L是PWM模式 DC/DC降壓轉換器。TEL&#xff1a;l86*4884*3702*寬輸入電壓范圍4至60V適用于工業領域的廣泛應用…

有意思、好用的免費API分享

Facebook Games Services - Facebook Games Services 為游戲開發者提供了各種服務, 包括(但不限于) 成就 API, 分數 API, 應用通知, 請求, 游戲養成和 Facebook SDK for Unity.Google Play Games Services - Google Developers Games 網站提供了各種 API, SDK 和服務, 包括(但不…

AI安全綜述

1、引言 AI安全這個話題&#xff0c;通常會引伸出來圖像識別領域的對抗樣本攻擊。下面這張把“熊貓”變“猴子”的攻擊樣例應該都不陌生&#xff0c;包括很多照片/視頻過人臉的演示也很多。 對抗樣本的研究領域已經具備了一定的成熟性&#xff0c;有一系列的理論來論述對抗樣本…

解決jquery-1.11.0.js安全漏洞

摘要&#xff1a;這個文件被掃出安全漏洞有XSS攻擊等 &#xff0c;其中一個比較著名的漏洞是在JQuery 1.6.2版本中發現的。該漏洞被稱為”attrFn"漏洞&#xff0c;它允許攻擊者通過特殊構造的代碼執行任意的JavaScript代碼。 一、統一解決方式&#xff1a; jQuery官網 官…

javafx實現復雜統計圖繪畫

JavaFX 是一個用于創建富互聯網應用程序 (Rich Internet Applications) 的軟件平臺,可以用于創建各種圖形和圖表。下面是一個示例代碼,演示如何使用 JavaFX 繪制復雜的統計圖。 import javafx.application.Application; import javafx.collections.FXCollections; import ja…

one wire(單總線)FPGA代碼篇

一.引言 單總線&#xff08;OneWire&#xff09;是一種串行通信協議&#xff0c;它允許多個設備通過一個單一的數據線進行通信。這個協議通常用于低速、短距離的數字通信&#xff0c;特別適用于嵌入式系統和傳感器網絡。 二.one wire通信優點缺點 優點&#xff1a; 單一數據線…

Unity程序向Web服務器發送數據

Unity程序向Web服務器發送數據 一、介紹二、HTTP協議三、新建Unity工程&#xff0c;創建腳本1.新建Unity工程&#xff0c;創建腳本WebManager.cs&#xff0c;將其指定給場景中的任意游戲體。2.在WebManager.cs中添加一個m_info屬性和OnGUI函數顯示UI&#xff1a; 四、GET請求在…

npm使用詳解(好吧好吧是粗解)

目錄 npm是什么&#xff1f; npm有什么用&#xff1f; npm安裝 在 Windows 上 在 macOS 上 在 Linux 上&#xff08;使用 apt 包管理器為例&#xff09; 驗證 npm 安裝成功&#xff1a; npm使用 1. 初始化項目&#xff1a; 2. 安裝和管理依賴&#xff1a; 3. 查看和…

【DataV】DataV組件庫——更新數據視圖不更新

參考文章&#xff1a;dataV組件庫——改變數據視圖不主動刷新 問題&#xff1a; 拿到后端數值就直接賦值了&#xff0c;但是視圖&#xff08;頁面&#xff09;沒有更新。 解決&#xff1a; 官方文檔介紹dataV里面的組件props均未設置deep監聽&#xff0c;刷新props時&#xf…

一個利用摸魚時間背單詞的軟件

大家好&#xff0c;我是 Java陳序員。 最近進入了考試季&#xff0c;各種考試&#xff0c;英語四六級、考研、期末考等。不知道大家的英語四六級成績怎么樣呢&#xff1f; 記得大學時&#xff0c;英語四級都是靠高中學習積累的老本才勉強過關。 而六級則是考了多次&#xff…

20231224解決outcommit_id.xml1 parser error Document is empty的問題

20231224解決outcommit_id.xml1 parser error Document is empty的問題 2023/12/24 18:13 在開發RK3399的Android10的時候&#xff0c;出現&#xff1a;rootrootrootroot-X99-Turbo:~/3TB/Rockchip_Android10.0_SDK_Release$ make installclean PLATFORM_VERSION_CODENAMEREL…

靜態HTTP的常見問題和解決方法

大家好&#xff0c;歡迎來到今天的“靜態HTTP大講堂”&#xff01;今天我們要聊聊靜態HTTP的常見問題和解決方法。別小看這些問題哦&#xff0c;它們就像是那些頑皮的小妖精&#xff0c;時不時地給你的網站搞點惡作劇。不過別擔心&#xff0c;有我在&#xff0c;這些小妖精都得…

推薦一款好用的免費圖片轉換工具bmp轉png工具bmp2png

推薦一款好用的免費圖片轉換工具bmp轉png工具bmp2png 寫這個工具是因為要使用傳奇的部分素材在COCOS2DX使用&#xff0c;但是COCOS2DX不支持BMP如果直接將BMP轉換到PNG的話&#xff0c;網上找到的工具都不支持透明色轉換。難道要用PS一個一個摳圖嗎&#xff1f;要累死所以寫了…

HBase 超大表遷移、備份、還原、同步演練手冊:全量快照 + 實時同步(Snapshot + Replication)不停機遷移方案

博主歷時三年精心創作的《大數據平臺架構與原型實現:數據中臺建設實戰》一書現已由知名IT圖書品牌電子工業出版社博文視點出版發行,點擊《重磅推薦:建大數據平臺太難了!給我發個工程原型吧!》了解圖書詳情,京東購書鏈接:https://item.jd.com/12677623.html,掃描左側二維…

如何選擇適合業務的負載均衡策略?

在分布式系統的高可用設計中&#xff0c;負載均衡非常關鍵&#xff0c;我們知道&#xff0c;分布式系統的特性之一就是支持快速擴展&#xff0c;那么集群擴展之后&#xff0c;服務請求如何從服務器列表中選擇合適的一臺呢&#xff1f;這就需要依賴負載均衡策略。 負載均衡在處…