Stream 流式编程创建及其常用操作方法
目录
Stream 对象如何创建
Stream 常用的操作方法
1.过滤(Filter)
2.映射(Map)
3.扁平映射(FlatMap)
4.截断(Limit)
5.跳过(Skip)
6.排序(Sorted)
7.去重(Distinct)
8.汇总(Collect)
9.归约(Reduce)
10.统计(Summary Statistics)
Stream 对象如何创建
在Java中,可以通过多种方式创建Stream对象。下面列举了几个常用的方法:
- 从集合创建Stream:可以使用
stream()方法从Collection接口的实现类(如List、Set)中创建Stream对象。 - 从数组创建Stream:可以使用
Arrays.stream()方法从数组中创建Stream对象。 - 其他方法:还可以使用各种I/O操作、日期时间API等创建特定类型的Stream对象。
- 通过Stream的静态方法创建Stream:Stream类提供了一些静态方法来创建Stream对象。
1)使用Stream.of()方法可以接受任意数量的参数,并将它们转换为Stream对象。
2)使用Stream.iterate()方法可以生成一个包含无限序列的Stream对象,需要传入初始值和生成下一个元素的函数。
3)使用Stream.generate()方法可以生成一个包含无限元素的Stream对象,需要传入生成元素的函数。
package com.common.demo.stream;import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.LocalDate;
import java.util.Arrays;
import java.util.List;
import java.util.stream.IntStream;
import java.util.stream.Stream;/*** @author Evan Walker* @version 1.0* @desc* @date 2023/10/09 21:46:25*/
public class StreamDemo {public static void main(String[] args) throws Exception {// 在Java中,可以通过多种方式创建Stream对象。下面列举了几个常用的方法:// 从集合创建Stream:可以使用stream()方法从Collection接口的实现类(如List、Set)中创建Stream对象。List<String> list = Arrays.asList("a", "b", "c");Stream<String> stream1 = list.stream();// 从数组创建Stream:可以使用Arrays.stream()方法从数组中创建Stream对象。int[] array = {1, 2, 3, 4, 5};IntStream stream2 = Arrays.stream(array);//其他方法:还可以使用各种I/O操作、日期时间API等创建特定类型的Stream对象。Stream<Path> stream3 = Files.list(Paths.get("dir"));Stream<LocalDate> stream7 = LocalDate.now().datesUntil(LocalDate.now().plusDays(7));//通过Stream的静态方法创建Stream:Stream类提供了一些静态方法来创建Stream对象。//使用Stream.of()方法可以接受任意数量的参数,并将它们转换为Stream对象。Stream<String> stream4 = Stream.of("a", "b", "c");//使用Stream.iterate()方法可以生成一个包含无限序列的Stream对象,需要传入初始值和生成下一个元素的函数。Stream<Integer> stream5 = Stream.iterate(0, n -> n + 1);// 使用Stream.generate()方法可以生成一个包含无限元素的Stream对象,需要传入生成元素的函数。Stream<Double> stream6 = Stream.generate(Math::random);}
}
这些只是创建Stream对象的一些常用方法,根据不同的需求和数据源,可以选择适合的方式来创建Stream。创建Stream后,可以通过链式调用中间操作和终止操作来对数据进行处理和操作。
Stream 常用的操作方法
1.过滤(Filter)
filter() 方法接受一个 Predicate 函数作为参数,用于过滤 Stream 中的元素。只有满足 Predicate 条件的元素会被保留下来。例如:
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
Stream<Integer> filteredStream = stream.filter(n -> n % 2 == 0); // 过滤出偶数
2.映射(Map)
map() 方法接受一个 Function 函数作为参数,用于对 Stream 中的元素进行映射转换。对每个元素应用函数后的结果会构成一个新的 Stream。例如:
Stream<String> stream = Stream.of("apple", "banana", "cherry");
Stream<Integer> mappedStream = stream.map(s -> s.length()); // 映射为单词长度
3.扁平映射(FlatMap)
flatMap() 方法类似于 map() 方法,不同之处在于它可以将每个元素映射为一个流,并将所有流连接成一个流。这主要用于解决嵌套集合的情况。例如:
List<List<Integer>> nestedList = Arrays.asList( Arrays.asList(1, 2), Arrays.asList(3, 4), Arrays.asList(5, 6) );
Stream<Integer> flattenedStream = nestedList.stream().flatMap(List::stream); // 扁平化为一个流
4.截断(Limit)
limit() 方法可以限制 Stream 的大小,只保留前 n 个元素。例如
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
Stream<Integer> limitedStream = stream.limit(3); // 只保留前 3 个元素
5.跳过(Skip)
skip() 方法可以跳过 Stream 中的前 n 个元素,返回剩下的元素组成的新 Stream。例如:
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
Stream<Integer> skippedStream = stream.skip(2); // 跳过前 2 个元素
6.排序(Sorted)
sorted() 方法用于对 Stream 中的元素进行排序,默认是自然顺序排序。还可以提供自定义的 Comparator 参数来指定排序规则。例如:
Stream<Integer> stream = Stream.of(5, 2, 4, 1, 3);
Stream<Integer> sortedStream = stream.sorted(); // 自然顺序排序
7.去重(Distinct)
distinct() 方法用于去除 Stream 中的重复元素,根据元素的 equals() 和 hashCode() 方法来判断是否重复。例如:
Stream<Integer> stream = Stream.of(1, 2, 2, 3, 3, 3);
Stream<Integer> distinctStream = stream.distinct(); // 去重
8.汇总(Collect)
collect() 方法用于将 Stream 中的元素收集到结果容器中,如 List、Set、Map 等。可以使用预定义的 Collectors 类提供的工厂方法来创建收集器,也可以自定义收集器。例如:
Stream<String> stream = Stream.of("apple", "banana", "cherry");
List<String> collectedList = stream.collect(Collectors.toList()); // 收集为 List
9.归约(Reduce)
reduce() 方法用于将 Stream 中的元素依次进行二元操作,得到一个最终的结果。它接受一个初始值和一个 BinaryOperator 函数作为参数。例如:
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
Optional<Integer> sum = stream.reduce((a, b) -> a + b); // 对所有元素求和
10.统计(Summary Statistics)
summaryStatistics() 方法可以从 Stream 中获取一些常用的统计信息,如元素个数、最小值、最大值、总和和平均值。例如:
IntStream stream = IntStream.of(1, 2, 3, 4, 5);
IntSummaryStatistics stats = stream.summaryStatistics();
System.out.println("Count: " + stats.getCount());
System.out.println("Min: " + stats.getMin());
System.out.println("Max: " + stats.getMax());
System.out.println("Sum: " + stats.getSum());
System.out.println("Average: " + stats.getAverage());
以上只是 Stream API 提供的一部分常用操作方法,还有许多其他操作方法,如匹配(Match)、查找(Find)、遍历(ForEach)等。
更多消息资讯,请访问昂焱数据(https://www.ayshuju.com)
相关文章:
Stream 流式编程创建及其常用操作方法
目录 Stream 对象如何创建 Stream 常用的操作方法 1.过滤(Filter) 2.映射(Map) 3.扁平映射(FlatMap) 4.截断(Limit) 5.跳过(Skip) 6.排序(…...
Can 通信-协议
概述 CAN 是 Controller Area Network 的缩写(以下称为 CAN),是 ISO国际标准化的串行通信协议。 在当前的汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统 被开发了出来。由于…...
rustlings本地开发环境配置
克隆自己的仓库 首先我们要在github上找到自己仓库并把它克隆到本地 git clone https://github.com/LearningOS/rust-rustlings-2023-autumn-******.git下载插件 rust-analyzer和Git Graph一个可以用来解析rust代码,另一个可以可视化管理git代码库 下载rustling…...
希尔排序:优化插入排序的精妙算法
排序算法在计算机科学中扮演着重要的角色,其中希尔排序(Shell Sort)是一种经典的排序算法。本文将带您深入了解希尔排序,包括其工作原理、性能分析以及如何使用 Java 进行实现。 什么是希尔排序? 希尔排序,…...
新能源电动汽车安全性能检测中采集车架号及BMS电池数据的难点
按照新能源电动汽车安全性能检测,必须采集到汽车的车架号及BMS电池数据做对应的评测。国内电动汽车主要以比亚迪、特斯拉、广汽埃安、五菱新能源、长安新能源、大众、理想、蔚来、哪吒等主流为主。与传统燃油车不同的是,电动汽车不用执行OBD2标准&#x…...
函数reshape(-1,)里的-1的意思
reshape函数是对narray的数据结构进行维度变换,由于变换遵循对象元素个数不变,在进行变换时,假设一个数据对象narray的总元素个数为N,如果我们给出一个维度为(m,-1)时,我们就理解为将…...
名词作形容词的用法
【名词作形容词的用法】 有考英语二的同学问我,为什么名词能修饰名词,比如spending proportion(支出比例), job satisfaction(工作满意度),之前老师不是说这种写法不能乱用么? 那我在这里简单说明一下“形…...
若依微服务部署,裸服务部署、docker部署、k8s部署
目录 前言windows 部署若依-微服务版本浏览器验证docker部署若依-微服务版本浏览器验证k8s部署若依-微服务版本浏览器验证总结 前言 环境:centos7、Win10 若依是一个合适新手部署练习的开源的微服务项目,本篇讲解Windows部署若依微服务、docker部署若依…...
【置顶】关于博客的一些公告
所谓 万事开头难,最开始的两个专栏 《微机》 和 《骨骼动作识别》 定价 29.9 ,因为: 刚开始确实比较困难,要把自己学的知识彻底搞懂讲给别人,还要 码字排版,从 Markdown 语法开始学起(这都是 花…...
Fastadmin后端表格动态展示列
前言 后端有多角色时, 往往有些表格中的列需要根据条件来根据角色身份决定是不是需要该角色查看, 为此就衍生出一个需要动态控制展示某列的需求fastadmin框架内调用的table实际上在初始化时, 可以修改columns中的visible属性来控制是否显示, 但是这个参数只能传入bool, 不能像…...
如何在ubnutu上安装docker
卸载旧版本 sudo apt-get remove docker docker-engine docker.io添加HTTPS传输软件包以及CA证书 sudo apt-get update sudo apt-get install \apt-transport-https \ca-certificates \curl \gnupg \lsb-release添加国内源以提升网速 添加软件源的GPG秘钥以确认所下载软件包…...
Mall脚手架总结(三) —— MongoDB存储浏览数据
前言 通过Elasticsearch整合章节的学习,我们了解SpringData框架以及相应的衍生查询的方式操作数据读写的语法。MongoDB的相关操作也同样是借助Spring Data框架,因此这篇文章的内容比较简单,重点还是弄清楚MongoDB的使用场景以及如何通过Sprin…...
Maven 引入外部依赖
如果我们需要引入第三方库文件到项目,该怎么操作呢? pom.xml 的 dependencies 列表列出了我们的项目需要构建的所有外部依赖项。 要添加依赖项,我们一般是先在 src 文件夹下添加 lib 文件夹,然后将你工程需要的 jar 文件复制到 …...
BS EN 12104-2023 软木地砖检测
软木地砖是指含有烧结成分的软木制成的块状砖,可用于地面覆盖物,装饰层等,具有脚感柔软舒适,防滑性能好,静音等性能,同时也其耐磨性较差,不易清洁。 BS EN 12104-2023软木地砖测试 测试项目 测…...
用Nginx搭建一个可用的静态资源Web服务器
sudo wget http://dlib.net/files/dlib-19.24.tar.bz2下载需要的文件。 sudo tar jxf dlib-19.24.tar.bz2进行解压。 sudo mkdir /nginx/dlib在nginx安装目录/nginx创建一个新的目录dlib。 配置文件nginx.conf里边的内容如下: worker_processes 1; events {…...
MAX30102心率血氧传感器
MAX30102心率血氧传感器介绍 背景基本功能基本结构基本原理采集方法直通式采集方法反射式采集方法 血氧采集原理Beer-Lambert 定理皮肤组织模型血氧测量过程AC / DC 的计算 心率采集原理 实验结果代码走读资源链接 背景 目前,基本上所有的可穿戴式设备都集成了心率…...
高效解决 TypeError : ‘ numpy._DTypeMeta‘ object is not subscriptable 问题
文章目录 问题描述解决问题 问题描述 解决问题 参考博文 打开报错位置 AppData\Roaming\Python\Python39\site-packages\cv2\typing\ 添加single-quotes,即单引号 博主说The trick is to use single-quotes to avoid the infamous TypeError: ‘numpy._DTypeMeta’…...
Hadoop作业篇(一)
一、选择题 1. 以下哪一项不属于Hadoop可以运行的模式__C____。 A. 单机(本地)模式 B. 伪分布式模式 C. 互联模式 D. 分布式模式 C. 互联模式 不属于Hadoop可以运行的模式。 Hadoop主要有四种运行模式: A. 单机(本地…...
SpringCloud中的分布式锁用法详解(Java+Redis SETNX命令)
前言: 在分布式系统中,保证数据的一致性和并发控制是至关重要的。分布式锁能够解决多个进程/线程同时访问共享资源的问题,确保只有一个进程/线程能够获得锁。本文将介绍如何使用Java和Redis实现分布式锁,并提供示例代码和注意事项…...
初学者如何选择:前端开发还是后端开发?
#开发做前端好还是后端好【话题征文】# 作为一名有多年开发经验的过来人,我认为前端开发和后端开发都有其独特的魅力和挑战。下面我将就我的个人经历和观点来分享一些关于前端开发和后端开发的看法。 首先,让我们将编程世界的大城市比作前端开发和后端开…...
基于RK3568的边缘AIoT实战:多模态行为识别系统设计与优化
1. 项目概述:从赛题到全国一等奖的实战复盘去年,我们团队抱着“试试看”的心态参加了瑞芯微与飞凌嵌入式联合举办的全国大学生嵌入式设计大赛,最终捧回了全国一等奖的奖杯。现在比赛尘埃落定,我想把整个项目从破题、选型、开发到最…...
嵌入式音频处理与SD卡系统克隆实战指南
1. 项目概述与核心价值如果你正在捣鼓一块像Chumby Hacker Board这样的嵌入式开发板,或者任何带有音频输出和SD卡存储的Linux设备,那么你迟早会碰到两个绕不开的“硬骨头”:音频信号的处理和存储系统的克隆部署。前者决定了你的设备能不能“好…...
FS8024A芯片实现USB-C PD诱骗:打造TYPE-C转DC电源转接头方案
1. 项目概述:一个“小接口”背后的大世界 最近在折腾一个便携显示器项目,手头有现成的12V驱动板,但供电却成了麻烦事。现在谁还愿意随身带个笨重的12V电源适配器?满世界都是USB-C接口的充电宝和笔记本充电器。于是,一个…...
aztfexport扩展开发:如何自定义资源映射和导入逻辑
aztfexport扩展开发:如何自定义资源映射和导入逻辑 【免费下载链接】aztfexport A tool to bring existing Azure resources under Terraforms management 项目地址: https://gitcode.com/gh_mirrors/az/aztfexport Azure Export for Terraform(a…...
NotebookLM音乐学应用的5个致命误区(附诊断清单),90%新手在第3步就误入歧途导致文献溯源失效
更多请点击: https://intelliparadigm.com 第一章:NotebookLM音乐学研究辅助的底层逻辑与适用边界 NotebookLM 本质是一个基于用户上传文档构建私有语义索引的轻量级 AI 助手,其核心并非通用大模型的自由生成,而是“引用驱动型推…...
Claude集成OpenClaw:多智能体框架的模型驱动开发实践
1. 项目概述:当Claude遇上OpenClaw,一个智能体协作框架的诞生最近在AI智能体开发圈里,一个名为“gungwang/claude-into-openclaw”的项目引起了我的注意。乍一看这个标题,你可能会有点懵——“Claude”是Anthropic家的那个大语言模…...
别再手动调图了:用Python+Midjourney API自动批处理建筑效果图(含GitHub开源脚本+37个真实项目参数)
更多请点击: https://kaifayun.com 第一章:别再手动调图了:用PythonMidjourney API自动批处理建筑效果图(含GitHub开源脚本37个真实项目参数) 建筑可视化团队常面临重复性高、参数微调繁琐的出图任务——同一方案需生…...
微内核操作系统nanoclaw:面向嵌入式与边缘计算的极简设计
1. 项目概述:一个为嵌入式与边缘计算而生的微型操作系统最近在折腾一些资源极其有限的嵌入式板子,比如只有几十KB内存的MCU,或者那些主打低功耗的边缘计算节点。在这些场景下,跑一个完整的Linux系统简直是天方夜谭,而传…...
USB Type-C接口技术解析与工程实践
1. USB接口技术演进与Type-C核心优势USB Type-C接口自2014年发布以来,凭借其革命性的设计理念迅速成为移动设备的主流接口标准。作为从业十余年的硬件工程师,我见证了从USB 2.0 OTG到Type-C的完整迁移过程。与传统micro-A/B接口相比,Type-C最…...
Rust服务脚手架:快速构建生产级微服务的标准化起点
1. 项目概述:为什么我们需要一个Rust服务脚手架?在当今的微服务与云原生架构浪潮中,快速启动一个健壮、可维护的后端服务是每个开发团队的核心诉求。如果你和我一样,厌倦了每次开启新项目时,都要重复搭建项目结构、配置…...
