当前位置: 首页 > article >正文

Java Stream 全面解析

Java Stream 全面解析

Java 8 引入的 Stream API 提供了一种高效且声明式的方式来处理集合数据。Stream 允许你以函数式编程风格操作数据,支持并行处理,并且可以显著简化代码。下面我们将从 创建操作中间操作终端操作 三个方面进行全面深入的解析,并给出代码示例。


1. 创建操作

创建 Stream 的方式有多种,以下是常见的创建方式:

1.1 从集合创建
List<String> list = Arrays.asList("apple", "banana", "cherry");
Stream<String> streamFromList = list.stream();
1.2 从数组创建
String[] array = {"apple", "banana", "cherry"};
Stream<String> streamFromArray = Arrays.stream(array);
1.3 使用 Stream.of
Stream<String> streamOf = Stream.of("apple", "banana", "cherry");
1.4 使用 Stream.iterate
Stream<Integer> streamIterate = Stream.iterate(0, n -> n + 2).limit(5); // 0, 2, 4, 6, 8
1.5 使用 Stream.generate
Stream<Double> streamGenerate = Stream.generate(Math::random).limit(5); // 5个随机数
1.6 使用 Files.lines 从文件创建
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;Stream<String> lines = Files.lines(Paths.get("file.txt")); // 从文件中读取行

2. 中间操作

中间操作返回一个新的 Stream,可以链式调用。常见的中间操作包括:

2.1 filter

过滤流中的元素。

List<String> list = Arrays.asList("apple", "banana", "cherry", "date");
List<String> filteredList = list.stream().filter(s -> s.length() > 5).collect(Collectors.toList());
System.out.println(filteredList); // [banana, cherry]
2.2 map

将流中的每个元素映射为另一个元素。

List<String> list = Arrays.asList("apple", "banana", "cherry");
List<Integer> lengths = list.stream().map(String::length).collect(Collectors.toList());
System.out.println(lengths); // [5, 6, 6]
2.3 flatMap

将流中的每个元素映射为一个流,然后将所有流合并为一个流。

List<List<String>> nestedList = Arrays.asList(Arrays.asList("apple", "banana"),Arrays.asList("cherry", "date")
);
List<String> flatList = nestedList.stream().flatMap(List::stream).collect(Collectors.toList());
System.out.println(flatList); // [apple, banana, cherry, date]
2.4 sorted

对流中的元素进行排序。

List<String> list = Arrays.asList("banana", "apple", "cherry");
List<String> sortedList = list.stream().sorted().collect(Collectors.toList());
System.out.println(sortedList); // [apple, banana, cherry]
2.5 distinct

去除流中的重复元素。

List<String> list = Arrays.asList("apple", "banana", "apple", "cherry");
List<String> distinctList = list.stream().distinct().collect(Collectors.toList());
System.out.println(distinctList); // [apple, banana, cherry]
2.6 limit

截取流中的前 N 个元素。

List<String> list = Arrays.asList("apple", "banana", "cherry", "date");
List<String> limitedList = list.stream().limit(2).collect(Collectors.toList());
System.out.println(limitedList); // [apple, banana]
2.7 skip

跳过流中的前 N 个元素。

List<String> list = Arrays.asList("apple", "banana", "cherry", "date");
List<String> skippedList = list.stream().skip(2).collect(Collectors.toList());
System.out.println(skippedList); // [cherry, date]

3. 终端操作

终端操作触发流的执行并产生结果或副作用。常见的终端操作包括:

3.1 forEach

遍历流中的每个元素。

List<String> list = Arrays.asList("apple", "banana", "cherry");
list.stream().forEach(System.out::println); // apple, banana, cherry
3.2 collect

将流中的元素收集到集合或其他数据结构中。

List<String> list = Arrays.asList("apple", "banana", "cherry");
List<String> collectedList = list.stream().collect(Collectors.toList());
System.out.println(collectedList); // [apple, banana, cherry]
3.3 reduce

将流中的元素通过某种操作组合起来。

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Optional<Integer> sum = numbers.stream().reduce(Integer::sum);
sum.ifPresent(System.out::println); // 15
3.4 count

计算流中元素的数量。

List<String> list = Arrays.asList("apple", "banana", "cherry");
long count = list.stream().count();
System.out.println(count); // 3
3.5 anyMatch

检查流中是否有任意一个元素满足条件。

List<String> list = Arrays.asList("apple", "banana", "cherry");
boolean anyMatch = list.stream().anyMatch(s -> s.startsWith("b"));
System.out.println(anyMatch); // true
3.6 allMatch

检查流中是否所有元素都满足条件。

List<String> list = Arrays.asList("apple", "banana", "cherry");
boolean allMatch = list.stream().allMatch(s -> s.length() > 3);
System.out.println(allMatch); // true
3.7 noneMatch

检查流中是否没有元素满足条件。

List<String> list = Arrays.asList("apple", "banana", "cherry");
boolean noneMatch = list.stream().noneMatch(s -> s.startsWith("z"));
System.out.println(noneMatch); // true
3.8 findFirst

返回流中的第一个元素。

List<String> list = Arrays.asList("apple", "banana", "cherry");
Optional<String> firstElement = list.stream().findFirst();
firstElement.ifPresent(System.out::println); // apple
3.9 findAny

返回流中的任意一个元素(通常在并行流中使用)。

List<String> list = Arrays.asList("apple", "banana", "cherry");
Optional<String> anyElement = list.stream().findAny();
anyElement.ifPresent(System.out::println); // 可能是 apple, banana, cherry
3.10 minmax

返回流中的最小或最大元素。

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Optional<Integer> min = numbers.stream().min(Integer::compareTo);
Optional<Integer> max = numbers.stream().max(Integer::compareTo);
min.ifPresent(System.out::println); // 1
max.ifPresent(System.out::println); // 5
3.11 toArray

将流中的元素转换为数组。

List<String> list = Arrays.asList("apple", "banana", "cherry");
String[] array = list.stream().toArray(String[]::new);
System.out.println(Arrays.toString(array)); // [apple, banana, cherry]

4. 并行流

通过 parallelStream() 可以轻松实现并行处理,提高性能。

List<String> list = Arrays.asList("apple", "banana", "cherry", "date", "elderberry");
list.parallelStream().forEach(System.out::println); // 并行处理

总结

Java Stream 提供了丰富的操作,包括 创建操作中间操作终端操作。通过熟练掌握这些操作,你可以编写出简洁、高效且易于维护的代码。以下是关键点:

  • 创建操作:如 stream(), Stream.of, Stream.iterate, Stream.generate 等。
  • 中间操作:如 filter, map, flatMap, sorted, distinct, limit, skip 等。
  • 终端操作:如 forEach, collect, reduce, count, anyMatch, allMatch, noneMatch, findFirst, findAny, min, max, toArray 等。

希望这些内容能帮助你全面掌握 Java Stream!

相关文章:

Java Stream 全面解析

Java Stream 全面解析 Java 8 引入的 Stream API 提供了一种高效且声明式的方式来处理集合数据。Stream 允许你以函数式编程风格操作数据&#xff0c;支持并行处理&#xff0c;并且可以显著简化代码。下面我们将从 创建操作、中间操作 和 终端操作 三个方面进行全面深入的解析…...

OpenCV识别电脑摄像头中的圆形物体

思路步骤 初始化摄像头&#xff1a;使用cv2.VideoCapture打开电脑摄像头。处理每一帧图像&#xff1a;对摄像头捕获的每一帧图像进行处理&#xff0c;包括灰度化、高斯模糊、霍夫圆变换等操作。绘制圆形和圆心&#xff1a;如果检测到圆形&#xff0c;使用cv2.circle函数用黄线…...

如何在 Tomcat 中屏蔽错误报告

Tomcat 屏蔽错误信息 <h1>HTTP状态 400 - 错误的请求</h1><hr class"line" /><p><b>类型</b> 异常报告</p><p><b>消息</b> 在请求目标中找到无效字符。有效字符在RFC 7230和RFC 3986中定义</p>&…...

Vue 入门到实战 十

第10章 Vue Router​​​​​​​ 目录 10.1 什么是路由 10.2 Vue Router的安装 10.2.1 本地独立版本方法 10.2.2 CDN方法 10.2.3 NPM方法 10.2.4 命令行工具&#xff08;Vue CLI&#xff09;方法 10.3 Vue Router的基本用法 10.3.1 跳转与传参 10.3.2 配置路由 10.…...

jenkins-获取当前时间戳

一. 简述&#xff1a; 很多场景下&#xff0c;需要获取当前时间戳。 二. 使用方法&#xff1a; 1. 安装&#xff1a; 最简单的&#xff0c; 莫过于直接部署相关插件&#xff1a; Build Timestamp Plugin 2. 配置&#xff1a; 3. 使用&#xff1a; post {success {script…...

springboot mybatis-plus 集成多数据源

在 Spring Boot 项目中集成 MyBatis-Plus 并配置多数据源&#xff0c;可以按照以下步骤进行。这个示例将展示如何配置两个数据源&#xff0c;并确保每个数据源都有自己对应的 SqlSessionFactory 和事务管理器。 1. 添加依赖 首先&#xff0c;在你的 pom.xml 文件中添加必要的…...

SSH 登录到 Linux 服务器为什么没有要求输入密码

如果你通过 SSH 登录到 Linux 服务器时没有要求输入密码&#xff0c;通常有以下几种可能性&#xff1a; 1. 使用 SSH 密钥认证 最常见的原因是你的 SSH 登录使用了 公钥认证&#xff0c;而不是密码认证。在这种情况下&#xff0c;服务器上已经配置了你的公钥&#xff0c;并且…...

Kafka 中基于 Segment 和 Offset 查找消息的过程

Kafka 中基于 Segment 和 Offset 查找消息的过程 假设我们有一个 Kafka Topic&#xff0c;其 Partition 划分为多个 Segment 文件。每个 Segment 文件包含 .log、.index 和 .timeindex 文件。现在我们需要查找 Offset 为 368801 的消息。 假设条件 Partition&#xff1a;par…...

【Jenkins流水线搭建】

Jenkins流水线搭建 01、SpringBoot项目 - Jenkins基于Jar持续集成搭建文档基于手动方式发布项目基于dockerfile基于jenkins + dockerfile + jenkinsfile +pieline基于jenkins + jar方式的发布01、环境说明01、准备项目02、准备服务器03、安装git04、安装jdk1.805、安装maven依赖…...

【Java】规则引擎 Drools

https://www.bilibili.com/video/BV1nW421R7qJ 来自尚硅谷 背景 /*** 设置订单积分*/ public void setOrderPoint(Order order){if (order.getAmout() < 100){order.setScore(0);}else if(order.getAmout() > 100 && order.getAmout() < 500){order.setScore(…...

Transformer以及BERT阅读参考博文

Transformer以及BERT阅读参考博文 Transformer学习&#xff1a; 已有博主的讲解特别好了&#xff1a; 李沐&#xff1a;Transformer论文逐段精读【论文精读】_哔哩哔哩_bilibili知乎&#xff1a;Transformer模型详解&#xff08;图解最完整版&#xff09; - 知乎 个人杂想&…...

深入浅出Java反射:掌握动态编程的艺术

小程一言反射何为反射反射核心类反射的基本使用获取Class对象创建对象调用方法访问字段 示例程序应用场景优缺点分析优点缺点 注意 再深入一些反射与泛型反射与注解反射与动态代理反射与类加载器 结语 小程一言 本专栏是对Java知识点的总结。在学习Java的过程中&#xff0c;学习…...

python 替换字符串

在 Python 中&#xff0c;替换字符串可以通过多种方式实现&#xff0c;具体取决于您的需求和上下文。以下是几种常见的方法&#xff1a; 1. 使用 str.replace() 方法 str.replace(old, new[, count]) 是最常用的字符串替换方法。它会将字符串中的所有匹配项替换为新的字符串。…...

数据挖掘智能Agent

&#x1f917; CodeGenie - 智能编程助手 数据处理和分析对于数据分析工作人员来说&#xff0c;往往既复杂又令人头疼&#xff0c;需要耗费大量精力进行重复性工作。为了解决这一问题&#xff0c;我们开发了一款集成了自然语言处理和代码生成功能的智能编程助手——CodeGenie。…...

动手学深度学习11.7. AdaGrad算法-笔记练习(PyTorch)

以下内容为结合李沐老师的课程和教材补充的学习笔记&#xff0c;以及对课后练习的一些思考&#xff0c;自留回顾&#xff0c;也供同学之人交流参考。 本节课程地址&#xff1a;72 优化算法【动手学深度学习v2】_哔哩哔哩_bilibili 本节教材地址&#xff1a;11.7. AdaGrad算法…...

【鸿蒙开发】第三十六章 状态管理 - (V2)

目录​​​​​​​ 1 V2所属装饰器 1.1 ObservedV2装饰器和Trace装饰器&#xff1a;类属性变化观测 1、概述 2、装饰器说明 3、使用限制 1.2 ComponentV2装饰器&#xff1a;自定义组件 1、概述 1.3 Local装饰器&#xff1a;组件内部状态 1、概述 2、装饰器说明 3、…...

基础算法# 求一个数的二进制表示当中有几个1 (C++)

文章目录 题目链接题目解读思路完整代码参考 题目链接 题目解读 给定L,R。统计[L,R]区间内的所有数在二进制下包含的“1”的个数之和。 如5的二进制为101&#xff0c;包含2个“1”。 思路 直接将该数字转为二进制表示,求其有几个1即可。 完整代码 #include<bits/stdc.…...

3D机器视觉的类型、应用和未来趋势

3D机器视觉的类型、应用和未来趋势 类型 3D机器视觉技术主要分为以下几类&#xff1a; 立体视觉&#xff08;Stereo Vision&#xff09; 通过两个或多个摄像头从不同角度捕捉图像&#xff0c;利用视差计算深度信息&#xff0c;生成3D模型。 结构光&#xff08;Structured Li…...

【linux】在 Linux 上部署 DeepSeek-r1:32/70b:解决下载中断问题

【linux】在 Linux 上部署 DeepSeek-r1:32/70b:解决下载中断问题 【承接商业广告,如需商业合作请+v17740568442】 文章目录 【linux】在 Linux 上部署 DeepSeek-r1:32/70b:解决下载中断问题问题描述:解决方法方法一:手动中断并重启下载方法二:使用 Bash 脚本自动化下载在…...

什么是高亮环形光源

高亮环形光源是一种常用于机器视觉、工业检测和光学测量的照明设备。其特点是光线均匀、亮度高,并且呈环形分布,能够为被检测物体提供均匀的照明,减少阴影和反光,提高图像采集的质量。 主要特点: 环形设计:光源呈环形分布,适合安装在镜头周围,能够为物体提供均匀的照明…...

SpringBoot+Vue+微信小程序的高校食堂点餐系统

感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望帮助更多的人。 系统介绍 食堂点餐系统&#xff0c;作为一款融合现代信息技术的高效餐饮服务利器&#xff0c;以其…...

gitlab修改默认端口

问题&#xff1a;gitlab和zabbix部署在同一台服务器上导致80端口冲突 修改gitlab默认端口为8088&#xff1a; 第一步&#xff1a;修改/etc/gitlab/gitlab.rb文件 nginx[listen_port] 8088 第二步&#xff1a;修改默认的gitlab nginx的web服务80端 /var/opt/git…...

大预言模型|微调大预言模型初探索(LLaMA-Factory)(1)

前言 微调模型通常比从零开始训练一个模型的技术要求低。公司不需要拥有大量的深度学习专家&#xff0c;利用现有的开源工具和库&#xff08;如Hugging Face的Transformers等&#xff09;&#xff0c;中小型公司可以轻松地使用和微调大型模型&#xff0c;从而快速实现AI能力的集…...

IOTDB安装部署

IOTDB一般用于工业互联网&#xff0c;至于具体的介绍请自行搜索 1.环境准备 安装前需要保证设备上配有 JDK>1.8 的运行环境&#xff0c;并配置好 JAVA_HOME 环境变量。 设置最大文件打开数为 65535。 关闭防火墙 systemctl stop firewalld.service systemctl disable …...

【Day40 LeetCode】动态规划DP 回文子串问题

一、动态规划DP 回文子串问题 1、回文子串 647 dp数组如果采用一维的&#xff0c;很难进行推导。采用二维&#xff0c;一开始的想法是dp[i][j]表示s[i]~s[j]之间回文子串的个数&#xff0c;这样发现在推导递推公式时遇到困难&#xff0c;例如在s[i]s[j]时&#xff0c;不知道s…...

datasets: PyTorch version 2.5.1+cu124 available 这句话是什么意思

这句话的意思是&#xff1a; datasets&#xff1a;可能是 Python datasets 库的日志信息&#xff0c;说明它检测到了 PyTorch 的安装信息。PyTorch version 2.5.1cu124 available&#xff1a; PyTorch version 2.5.1&#xff1a;表示你的 PyTorch 版本是 2.5.1。cu124&#xf…...

如何通过MDM高效管理企业的Android平板?

目录 1. 批量配置设备&#xff08;Batch Device Provisioning&#xff09; 2. 应用推送与管理&#xff08;App Deployment & Management&#xff09; 3. 远程控制与故障排除&#xff08;Remote Control & Troubleshooting&#xff09; 4. 数据安全管理&#xff08;…...

mybatis-plus逆向code generator pgsql实践

mybatis-plus逆向code generator pgsql实践 环境准备重要工具的版本供参考pom依赖待逆向的SQL 配置文件CodeGenerator配置类配置类说明 环境准备 重要工具的版本 jdk1.8.0_131springboot 2.7.6mybatis-plus 3.5.7pgsql 14.15 供参考pom依赖 <?xml version"1.0&quo…...

深入理解DOM:22个核心知识点与代码示例

本文系统介绍DOM相关的22个核心概念&#xff0c;每个知识点均提供代码示例及简要说明&#xff0c;帮助开发者全面掌握DOM操作技巧。 一、DOM基础概念 1. DOM概念 DOM&#xff08;Document Object Model&#xff09;是HTML/XML的编程接口&#xff0c;通过JavaScript可动态修改…...

基于YALMIP和cplex工具箱的微电网最优调度算法matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 系统建模 4.2 YALMIP工具箱 4.3 CPLEX工具箱 5.完整工程文件 1.课题概述 基于YALMIP和cplex工具箱的微电网最优调度算法matlab仿真。通过YALMIP和cplex这两个工具箱&#xff0c;完成微电网的最优调…...