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类型的结果。
示例
- 基本示例:将整数列表中的每个元素平方
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]
- 将字符串列表中的每个元素转换为大写
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]
- 将对象列表中的某个属性提取出来
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]
- 将对象列表中的某个属性转换为另一个对象
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)
将流中的元素按某个条件分为两个分区(true 和 false)。
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
相关文章:
stream流常用方法
1.reduce 在Java中,可以使用Stream API的reduce方法来计算一个整数列表的乘积。reduce方法是一种累积操作,它可以将流中的元素组合起来,返回单个结果。对于计算乘积,你需要提供一个初始值(通常是1,因为乘法…...
最新扣子(Coze)案例教程:全自动DeepSeek 写影评+批量生成 + 发布飞书,提效10 倍!手把手教学,完全免费教程
👨💻群里有同学是做影视赛道的博主,听说最近DeepSeek这么火,咨询能不能用DeepSeek写影评,并整理电影数据资料,自动发布到飞书文档,把每天的工作做成一个自动化的流程。 那今天斜杠君就为大家…...
数据结构:动态数组vector
vector 是 C 标准库的动态数组。 在C语言中一般初学者会使用malloc,int[n]等方式来创建静态数组,但是这种方式繁琐且容易出错。我们做算法题一般使用动态数组vector, 并且在刷题网站的题目给的输入一般也是vector类型。 示例:vect…...
【HeadFirst系列之HeadFirst设计模式】第9天之模板方法模式:从咖啡和茶到Spring框架,掌握设计模式的精髓
模板方法模式:从咖啡和茶到Spring框架,掌握设计模式的精髓 《Head First 设计模式》是一本经典的设计模式入门书籍,它以轻松幽默的方式讲解了设计模式的核心思想。其中,模板方法模式是一个非常简单但非常实用的设计模式ÿ…...
力扣hot100——排序链表(常见方法,归并排序)
解题思路: 分解(Divide):将待排序的列表递归地分成两半,直到每个子列表只包含一个元素(此时每个子列表都是有序的)。解决(Conquer):递归地对每个子列表进行排…...
使用 DeepSeek 和 ECharts 实现大屏数据可视化
引言 在当今数据驱动的时代,数据可视化成为了分析和展示数据的重要手段。大屏数据可视化不仅能够直观地展示数据,还能帮助决策者快速理解复杂信息。本文将介绍如何结合 DeepSeek(一个强大的数据处理与分析工具)和 ECharts(一个流行的数据可视化库)来实现大屏数据可视化。…...
基于springboot+vue的新生报到管理系统
一、系统架构 前端:vue | element-ui | echarts 后端:springboot | mybatis-plus | jwt 环境:jdk1.8 | mysql | maven 二、代码及数据 三、功能介绍 01. 登录 02. 首页 03. 管理员-系统管理-用户管理 04. 管理员-系统…...
【面试系列】Java开发--AI常见面试题
文章目录 1、实际工作或学习中用过哪些Ai工具1.1、AI编程1.2、AI对话聊天1.3、AI图像工具1.4、AI办公工具 2、谈谈你知道的AI领域的一些常见词汇及其含义的理解? 例如AIGC、LLM、DeepLearning分别是什么意思?2.1、AIGC(Artificial Intelligen…...
Maven 基础环境搭建与配置(二)
四、本地仓库配置,存储依赖 在 Maven 的世界里,本地仓库就像是一个 “私人储物间”,专门用来存放项目所需的各种依赖构件,如 JAR 包、WAR 包等。当我们构建项目时,Maven 会首先在本地仓库中查找所需的依赖,…...
了解ffmpeg,安装并配置环境变量
一、了解FFmpeg FFmpeg 是一个功能强大的开源多媒体框架,能够处理音视频的录制、转换和流媒体传输。它由 Fabrice Bellard 发起,采用 LGPL/GPL 许可证,广泛应用于各种平台,包括 Linux、Windows 和 macOS 什么是FFmpeg࿱…...
Deepseek reasoning-content 透出调研
Deepseek reasoning-content 透出调研 部署方式:Docker Ollama Deepseek-R1:8b 参考: https://help.apiyi.com/deepseek-reasoning-content-guide.htmlhttps://yuluo-yx.github.io/blog/%E4%BD%BF%E7%94%A8-Ollama-%E9%83%A8%E7%BD%B2-DeepSeek-%E5…...
Codes 开源免费研发项目管理平台 2025年第一个大版本3.0.0 版本发布及创新的轻IPD实现
Codes 简介 Codes 是国内首款重新定义 SaaS 模式的开源项目管理平台,支持云端认证、本地部署、全部功能开放,并且对 30 人以下团队免费。它通过创新的方式简化研发协同工作,使敏捷开发更易于实施。并提供低成本的敏捷开发解决方案࿰…...
Leetcode K个一组翻转链表
双指针法,java solution class Solution {public ListNode reverseKGroup(ListNode head, int k) {if(head null || head.next null) return head;//设置pre和index节点ListNode pre head, index head.next;int m 0;while(m < k && index ! null) …...
电脑开机一段时间就断网,只有重启才能恢复网络(就算插网线都不行),本篇文章直接解决,不要再看别人的垃圾方法啦
下面的是我解决问题的心路历程,不想看的可以直接跳到解决方法上面! 内心思路: w11电脑更新过系统后,我的电脑是常年不关机的,但是一天突然断网,试了很多方法都连不上,重启电脑就会好࿰…...
Python 性能剖析利器:DTrace 与 SystemTap 深度指南
在 Python 开发过程中,深入了解程序的运行时行为对于优化性能、排查问题至关重要。本文聚焦于 DTrace 和 SystemTap 这两款强大的监控工具,详细介绍它们在 CPython 中的应用,包括启用静态标记、编写 DTrace 和 SystemTap 脚本、利用可用的静态…...
unity学习47:寻路和导航,unity2022后版本如何使用 Navmesh 和 bake
目录 1 寻路和导航对移动的不同 1.1 基础的移动功能 1.1.1 基础移动 1.1.2 智能导航寻路 1.1.3 智能导航寻路还可以 2 如何实现这个效果? 2.1 通过地图网格的形式 2.1.1 警告信息 the static value has been deprecated的对应搜索 2.1.2 新的navigation ba…...
工作-绩效笔记
文章目录 销售项目经理研发项目管理人天拆分抓手评估人天如何拆的细而且有理有据管理等 对这个一直不感兴趣,干好活就行了,但是公司肯定是出于量化的指标,而且不同角色指标不一样,记录下也科普下自己。 销售 销售额 确收、回款 …...
GPT-SoVITS更新V3 win整合包
GPT-SoVITS 是由社区开发者联合打造的开源语音生成框架,其创新性地融合了GPT语言模型与SoVITS(Singing Voice Inference and Timbre Synthesis)语音合成技术,实现了仅需5秒语音样本即可生成高保真目标音色的突破。该项目凭借其开箱…...
WPF的页面设计和实用功能实现
目录 一、TextBlock和TextBox 1. 在TextBlock中实时显示当前时间 二、ListView 1.ListView显示数据 三、ComboBox 1. ComboBox和CheckBox组合实现下拉框多选 四、Button 1. 设计Button按钮的边框为圆角,并对指针悬停时的颜色进行设置 一、TextBlock和TextBox…...
Python项目源码34:网页内容提取工具1.0(Tkinter+requests+html2text)
------★Python练手项目源码★------- Python项目32:订单销售额管理系统1.0(TkinterCSV) Python项目31:初学者也能看懂的聊天机器人1.0源码(命令行界面Re正则表达式) Python项目源码30:待办事…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
