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.mzph.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…