stream流常用方法

1.reduce

在Java中,可以使用Stream API的reduce方法來計算一個整數列表的乘積。reduce方法是一種累積操作,它可以將流中的元素組合起來,返回單個結果。對于計算乘積,你需要提供一個初始值(通常是1,因為乘法的單位元是1)和一個二元操作符(這里是乘法操作)。

以下是一個示例代碼,演示如何使用reduce方法來計算一個整數列表的乘積:

	import java.util.Arrays;import java.util.List;import java.util.Optional;public class ProductCalculator {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);// 使用reduce方法計算乘積Optional<Integer> product = numbers.stream().reduce(1, (a, b) -> a * b);// 由于reduce返回的是Optional,需要處理可能的空值if (product.isPresent()) {System.out.println("The product of the list is: " + product.get());} else {System.out.println("The list is empty or some error occurred.");}}
}
``
在這個例子中:numbers.stream() 創建一個整數列表的流。
.reduce(1, (a, b) -> a * b)1開始,將流中的每個元素依次乘以當前的結果。這里1是初始值,(a, b) -> a * b是累積操作(即將當前結果a與下一個元素b相乘)。
reduce方法返回一個Optional<Integer>,因為流操作可能會返回一個空的結果(例如,當流為空時)。
使用if (product.isPresent())來檢查乘積是否存在,如果存在則打印乘積,否則打印錯誤信息。
此外,如果確定列表不會為空,你也可以直接使用orElse方法來提供一個默認值,從而簡化代碼:```javapublic class ProductCalculator {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);// 使用reduce方法計算乘積,并提供默認值int product = numbers.stream().reduce(1, (a, b) -> a * b).orElse(1); // 如果列表為空,返回1作為默認值System.out.println("The product of the list is: " + product);}}

在這個改進的版本中,如果流為空,orElse(1)會確保返回一個默認值1,而不是處理Optional對象。

collect和collector.xx

List<Student> students = Arrays.asList(new Student("Alice", 20),new Student("Bob", 22),new Student("Charlie", 20),new Student("David", 22));//Arrays,collections//按學生的年齡分組。////打印每個年齡對應的學生姓名列表。students.stream().collect(Collectors.groupingBy(Student::getAge))//這里得到一個Map<Integer,list<String>>,然后利用foreach遍歷Map集合.forEach((age, studentsInAge) -> {System.out.println("Age: " + age);studentsInAge.forEach(student -> System.out.println("  Name: " + student.getName()));});```###  附:Map集合使用foreach遍歷```javaMap<String, Integer> map = new HashMap<>();
map.put("Apple", 1);
map.put("Banana", 2);
map.put("Cherry", 3);map.forEach((key, value) -> {System.out.println("Key: " + key + ", Value: " + value);
});

在 Java 的 Stream API 中,map 方法用于將流中的每個元素轉換為另一種形式。你可以使用 map 方法來對流中的每個元素進行某種操作,并返回一個新的流,其中包含轉換后的元素。

stream流的map方法基本用法

map 方法的簽名如下:

<R> Stream<R> map(Function<? super T, ? extends R> mapper)
  • T 是流中當前元素的類型。
  • R 是轉換后的新元素的類型。
  • Function<T, R> 是一個函數接口,它接受一個 T 類型的參數并返回一個 R 類型的結果。

示例

  1. 基本示例:將整數列表中的每個元素平方
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> squares = numbers.stream().map(n -> n * n) // 將每個元素平方.collect(Collectors.toList());
System.out.println(squares); // 輸出 [1, 4, 9, 16, 25]
  1. 將字符串列表中的每個元素轉換為大寫
List<String> words = Arrays.asList("apple", "banana", "grape", "kiwi", "orange");
List<String> upperCaseWords = words.stream().map(String::toUpperCase) // 將每個字符串轉換為大寫.collect(Collectors.toList());
System.out.println(upperCaseWords); // 輸出 [APPLE, BANANA, GRAPE, KIWI, ORANGE]
  1. 將對象列表中的某個屬性提取出來
List<Student> students = Arrays.asList(new Student("Alice", 20),new Student("Bob", 22),new Student("Charlie", 20),new Student("David", 22)
);List<String> names = students.stream().map(Student::getName) // 提取每個學生的姓名.collect(Collectors.toList());
System.out.println(names); // 輸出 [Alice, Bob, Charlie, David]
  1. 將對象列表中的某個屬性轉換為另一個對象
List<Person> people = Arrays.asList(new Person("Alice", 20),new Person("Bob", 17),new Person("Charlie", 25)
);List<String> upperCaseNames = people.stream().filter(person -> person.getAge() > 18) // 過濾年齡大于18的人.map(person -> person.getName().toUpperCase()) // 將名字轉換為大寫.collect(Collectors.toList());
System.out.println(upperCaseNames); // 輸出 [ALICE, CHARLIE]

完整代碼示例

以下是你的代碼中未完成的部分,以及如何使用 map 方法來完成它:

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class Test01 {public static void main(String[] args) {// 其他代碼...System.out.println("-----------------------------------------");// 過濾出所有年齡大于18歲的人。// 將他們的名字轉換為大寫。// 收集到一個新的列表中并打印。List<Person> people = Arrays.asList(new Person("Alice", 20),new Person("Bob", 17),new Person("Charlie", 25));List<String> upperCaseNames = people.stream().filter(person -> person.getAge() > 18) // 過濾年齡大于18的人.map(person -> person.getName().toUpperCase()) // 將名字轉換為大寫.collect(Collectors.toList()); // 收集到新的列表System.out.println(upperCaseNames); // 輸出 [ALICE, CHARLIE]}
}class Person {String name;int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

解釋

  • filter(person -> person.getAge() > 18):過濾出年齡大于18歲的 Person 對象。
  • map(person -> person.getName().toUpperCase()):將每個 Person 對象的名字轉換為大寫。
  • collect(Collectors.toList()):將轉換后的名字收集到一個新的 List 中。

## collector

Collectors 是 Java 8 中 Stream API 提供的一個強大工具,用于將流中的元素收集到集合或其他數據結構中。以下是一些常見的 Collectors 用法示例:


1. 收集到 List

將流中的元素收集到一個 List 中。

List<String> words = Arrays.asList("apple", "banana", "grape", "kiwi", "orange");
List<String> longWords = words.stream().filter(word -> word.length() > 5).collect(Collectors.toList());
System.out.println(longWords); // 輸出 [banana, orange]

2. 收集到 Set

將流中的元素收集到一個 Set 中,自動去重。

List<String> words = Arrays.asList("apple", "banana", "apple", "kiwi", "banana");
Set<String> uniqueWords = words.stream().collect(Collectors.toSet());
System.out.println(uniqueWords); // 輸出 [banana, apple, kiwi]

3. 收集到 Map

將流中的元素收集到一個 Map 中,鍵為元素本身,值為元素的長度。

List<String> words = Arrays.asList("apple", "banana", "grape", "kiwi", "orange");
Map<String, Integer> wordLengthMap = words.stream().collect(Collectors.toMap(word -> word, // Key: 單詞本身String::length // Value: 單詞長度));
System.out.println(wordLengthMap); // 輸出 {apple=5, banana=6, grape=5, kiwi=4, orange=6}

4. 分組(Grouping By)

將流中的元素按某個屬性分組。

List<Student> students = Arrays.asList(new Student("Alice", 20),new Student("Bob", 22),new Student("Charlie", 20),new Student("David", 22)
);Map<Integer, List<Student>> studentsByAge = students.stream().collect(Collectors.groupingBy(Student::getAge));studentsByAge.forEach((age, studentList) -> {System.out.println("Age: " + age);studentList.forEach(student -> System.out.println("  Name: " + student.getName()));
});

5. 分區(Partitioning By)

將流中的元素按某個條件分為兩個分區(truefalse)。

List<String> words = Arrays.asList("apple", "banana", "grape", "kiwi", "orange");
Map<Boolean, List<String>> partitionedWords = words.stream().collect(Collectors.partitioningBy(word -> word.length() > 5));System.out.println("Long words: " + partitionedWords.get(true)); // 輸出 [banana, orange]
System.out.println("Short words: " + partitionedWords.get(false)); // 輸出 [apple, grape, kiwi]

6. 連接字符串(Joining)

將流中的字符串元素連接成一個字符串。

List<String> words = Arrays.asList("apple", "banana", "grape", "kiwi", "orange");
String joinedWords = words.stream().collect(Collectors.joining(", "));
System.out.println(joinedWords); // 輸出 apple, banana, grape, kiwi, orange

7. 統計匯總(Summarizing)

對流中的元素進行統計匯總,如求和、平均值、最大值、最小值等。

List<Integer> numbers = Arrays.asList(3, 12, 8, 15, 20, 7, 10);
IntSummaryStatistics stats = numbers.stream().collect(Collectors.summarizingInt(Integer::intValue));System.out.println("Sum: " + stats.getSum()); // 輸出 75
System.out.println("Average: " + stats.getAverage()); // 輸出 10.714285714285714
System.out.println("Max: " + stats.getMax()); // 輸出 20
System.out.println("Min: " + stats.getMin()); // 輸出 3

8. 自定義收集器

通過 Collector.of 自定義收集器。

List<String> words = Arrays.asList("apple", "banana", "grape", "kiwi", "orange");
String concatenated = words.stream().collect(Collector.of(StringBuilder::new, // Supplier: 創建一個新的 StringBuilderStringBuilder::append, // Accumulator: 將每個元素添加到 StringBuilderStringBuilder::append, // Combiner: 合并兩個 StringBuilder(用于并行流)StringBuilder::toString // Finisher: 將 StringBuilder 轉換為字符串));
System.out.println(concatenated); // 輸出 applebananagrapekiwiorange

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

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

相關文章

pgAdmin4在mac m1上面簡單使用(Docker)

問題 想要在本地簡單了解一下pgAdmin4一些簡單功能。故需要在本機先安裝看一看。 安裝步驟 拉取docker鏡像 docker pull dpage/pgadmin4直接簡單運行pgAdmin4 docker run --name pgAdmin4 -p 5050:80 \-e "PGADMIN_DEFAULT_EMAILuserdomain.com" \-e "PGAD…

ubuntu下安裝TFTP服務器

在 Ubuntu 系統下安裝和配置 TFTP&#xff08;Trivial File Transfer Protocol&#xff09;服務器可以按照以下步驟進行&#xff1a; 1. 安裝 TFTP 服務器軟件包 TFTP 服務器通常使用 tftpd-hpa 軟件包&#xff0c;你可以使用以下命令進行安裝&#xff1a; sudo apt update …

Softing線上研討會 | 自研還是購買——用于自動化產品的工業以太網

| 線上研討會時間&#xff1a;2025年1月27日 16:00~16:30 / 23:00~23:30 基于以太網的通信在工業自動化網絡中的重要性日益增加。設備制造商正面臨著一大挑戰——如何快速、有效且經濟地將工業以太網協議集成到其產品中。其中的關鍵問題包括&#xff1a;是否只需集成單一的工…

vscode創建java web項目

一.項目部署 1.shiftctrlp&#xff0c;選擇java項目 2.選擇maven create from arcetype 3.選擇webapp 4.目錄結構如下&#xff0c;其中index.jsp是首頁 5.找到左下角的servers,添加tomcat服務器 選擇 再選擇&#xff1a; 找到你下載的tomcat 的bin目錄的上一級目錄&#x…

C語言指針學習筆記

1. 指針的定義 指針&#xff08;Pointer&#xff09;是存儲變量地址的變量。在C語言中&#xff0c;指針是一種非常重要的數據類型&#xff0c;通過指針可以直接訪問和操作內存。 2. 指針的聲明與初始化 2.1 指針聲明 指針變量的聲明格式為&#xff1a;數據類型 *指針變量名…

DeepSeek R1生成圖片總結2(雖然本身是不能直接生成圖片,但是可以想辦法利用別的工具一起實現)

DeepSeek官網 目前階段&#xff0c;DeepSeek R1是不能直接生成圖片的&#xff0c;但可以通過優化文本后轉換為SVG或HTML代碼&#xff0c;再保存為圖片。另外&#xff0c;Janus-Pro是DeepSeek的多模態模型&#xff0c;支持文生圖&#xff0c;但需要本地部署或者使用第三方工具。…

什么是Dubbo?Dubbo框架知識點,面試題總結

本篇包含什么是Dubbo&#xff0c;Dubbo的實現原理&#xff0c;節點角色說明&#xff0c;調用關系說明&#xff0c;在實際開發的場景中應該如何選擇RPC框架&#xff0c;Dubbo的核心架構&#xff0c;Dubbo的整體架構設計及分層。 主頁還有其他的面試資料&#xff0c;有需要的可以…

kafka消費能力壓測:使用官方工具

背景 在之前的業務場景中&#xff0c;我們發現Kafka的實際消費能力遠低于預期。盡管我們使用了kafka-go組件并進行了相關測試&#xff0c;測試情況見《kafka-go:性能測試》這篇文章。但并未能準確找出消費能力低下的原因。 我們曾懷疑這可能是由我的電腦網絡帶寬問題或Kafka部…

【大學生職業規劃大賽備賽PPT資料PDF | 免費共享】

自取鏈接&#xff1a; 鏈接&#xff1a;https://pan.quark.cn/s/4fa45515325e &#x1f4e2; 同學&#xff0c;你是不是正在為職業規劃大賽發愁&#xff1f; 想展示獨特思路卻不知如何下手&#xff1f; 想用專業模板卻找不到資源&#xff1f; 別擔心&#xff01;我整理了全網…

ubuntu20動態修改ip,springboot中yaml的內容的讀取,修改,寫入

文章目錄 前言引入包yaml原始內容操作目標具體代碼執行查看結果總結: 前言 之前有個需求&#xff0c;動態修改ubuntu20的ip&#xff0c;看了下&#xff1a; 本質上是修改01-netcfg.yaml文件&#xff0c;然后執行netplan apply就可以了。 所以&#xff0c;需求就變成了 如何對ya…

【算法】雙指針(下)

目錄 查找總價格為目標值的兩個商品 暴力解題 雙指針解題 三數之和 雙指針解題(左右指針) 四數之和 雙指針解題 雙指針關鍵點 注意事項 查找總價格為目標值的兩個商品 題目鏈接&#xff1a;LCR 179. 查找總價格為目標值的兩個商品 - 力扣&#xff08;LeetCode&#x…

Windows 圖形顯示驅動開發-IoMmu 模型

輸入輸出內存管理單元 (IOMMU) 是一個硬件組件&#xff0c;它將支持具有 DMA 功能的 I/O 總線連接到系統內存。 它將設備可見的虛擬地址映射到物理地址&#xff0c;使其在虛擬化中很有用。 在 WDDM 2.0 IoMmu 模型中&#xff0c;每個進程都有一個虛擬地址空間&#xff0c;即&a…

軟件測評報告包括哪些內容?第三方軟件測評機構推薦

在當今信息技術飛速發展的時代&#xff0c;軟件的品質與性能直接影響到企業的運營效率和市場競爭力。為了確保軟件的可用性和可靠性&#xff0c;軟件測評成為一個不可或缺的環節&#xff0c;軟件測評報告也是對軟件產品進行全面評估后形成的一份文檔&#xff0c;旨在系統地紀錄…

深淺拷貝區別,怎么區別使用

在 JavaScript 中&#xff0c;深拷貝&#xff08;Deep Copy&#xff09; 和 淺拷貝&#xff08;Shallow Copy&#xff09; 是兩種不同的對象復制方式&#xff0c;它們的區別主要體現在對嵌套對象的處理上。以下是它們的詳細對比及使用場景&#xff1a; 1. 淺拷貝&#xff08;Sh…

tailscale + derp中繼 + 阿里云服務器 (無域名版)

使用tailscale默認的中轉節點延遲很高&#xff0c;因為服務器都在國外。 感謝大佬提供的方案&#xff1a;Tailscale 搭建derp中繼節點&#xff0c;不需要域名&#xff0c;不需要備案&#xff0c;不需要申請證書&#xff08;最新&#xff09; - yafeng - 博客園 基于這個方案&…

【異常錯誤】pycharm debug view變量的時候顯示不全,中間會以...顯示

異常問題&#xff1a; 這個是在新版的pycharm中出現的&#xff0c;出現的問題&#xff0c;點擊view后不全部顯示&#xff0c;而是以...折疊顯示 在setting中這么設置一下就好了&#xff1a; 解決辦法&#xff1a; https://youtrack.jetbrains.com/issue/PY-75568/Large-stri…

【DeepSeek系列】04 DeepSeek-R1:帶有冷啟動的強化學習

文章目錄 1、簡介2、主要改進點3、兩個重要觀點4、四階段后訓練詳細步驟4.1 冷啟動4.2 推理導向的強化學習4.3 拒絕采樣和有監督微調4.4 針對所有場景的強化學習 5、蒸餾與強化學習對比6、評估6.1 DeepSeek-R1 評估6.2 蒸餾模型評估 7、結論8、局限性與未來方向 1、簡介 DeepS…

車載音頻配置(二)

目錄 OEM 自定義的車載音頻上下文 動態音頻區配置 向前兼容性 Android 14 車載音頻配置 在 Android 14 中,AAOS 引入了 OEM 插件服務,使你可以更主動地管理由車載音頻服務監督的音頻行為。 隨著新的插件服務的引入,車載音頻配置文件中添加了以下更改: ? OEM 自定義的車…

禁止WPS強制打開PDF文件

原文網址&#xff1a;禁止WPS強制打開PDF文件_IT利刃出鞘的博客-CSDN博客 簡介 本文介紹如何避免WPS強制打開PDF文件。 方法 1.刪除注冊表里.pdf的WPS綁定 WinR&#xff0c;輸入&#xff1a;regedit&#xff0c;回車。找到&#xff1a;HKEY_CLASSES_ROOT\.pdf刪除KWPS.PDF…

深入解析NoSQL數據庫:從文檔存儲到圖數據庫的全場景實踐

title: 深入解析NoSQL數據庫:從文檔存儲到圖數據庫的全場景實踐 date: 2025/2/19 updated: 2025/2/19 author: cmdragon excerpt: 通過電商、社交網絡、物聯網等12個行業場景,結合MongoDB聚合管道、Redis Stream實時處理、Cassandra SSTable存儲引擎、Neo4j路徑遍歷算法等42…