Java8 - Stream
介绍
Java8中有两大最为重要的改变。第一个是 Lambda 表达式; 另外一个则是 Stream API(java.util.stream.*)。
Stream是 Java8中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用 Stream API 对集合数据进行操作,就类似于使用 SQL执行的数据库查询。也可以使用Stream API来并行执行操作简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式。
流(Stream)到底是什么呢?
是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。“集合讲的是致据遏进的是让算*”
注意:
Stream 自己不会存储元素。
Stream 不会改变源对象。相反,他们会返回一个持有结果的新 Stream。
Stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。
生成 Stream
1/4 Collection体系集合
使用默认方法 stream() 生成流, default Stream<E> stream()
List<String> list = new ArrayList<String>();
Stream<String> listStream = list.stream();Set<String> set = new HashSet<String>();
Stream<String> setStream = set.stream();
2/4 Map体系集合
把Map转成Set集合,间接的生成流
Map<String,Integer> map = new HashMap<String, Integer>();
Stream<String> keyStream = map.keySet().stream();
Stream<Integer> valueStream = map.values().stream();
Stream<Map.Entry<String, Integer>> entryStream = map.entrySet().stream();
3/4 数组
通过Arrays中的静态方法stream生成流
String[] strArray = {"hello","world","java"};
Stream<String> strArrayStream = Arrays.stream(strArray);
4/4 同种数据类型的多个数据
通过Stream接口的静态方法of(T… values)生成流
Stream<String> strArrayStream2 = Stream.of("hello", "world", "java");
Stream<Integer> intStream = Stream.of(10, 20, 30);
Stream 流的中间操作
筛选与切片
- 多个中间操作可以连接起来形成一个流水线,除非流水线上触发终止操作,否则中间操作不会执行任何的处理!而在终止操作时一次性全部处理,称为“惰性求值”。
- filter:接收Lambda,从流中筛选出满足条件的元素。
过滤数据
// 留下满足条件的Stream<T> filter(Predicate predicate)
Stream<T> stream = list.stream().filter(s -> s.startsWith("张"));
跳过(不要前几个)
Stream<T> skip(long n)
Stream<String> s2 = list.stream().skip(2);
截取(只取前几个)
Stream<T> limit(long maxSize)
Stream<T> stream = list.stream().limit(3);
实现分页
Integer currentPage = 3;
Integer pageSize = 10;
List<Integer> collect = list.stream().skip( (currentPage - 1) * pageSize ).limit(pageSize).collect(Collectors.toList());
合并
static Stream concat(Stream a, Stream b)
Stream.concat(s1,s2);
去重
筛选,通过流所生成元素的hashcode()和equals()去除重复元素,要想实现成功,必须实体类实现重写这两个方法!
Stream distinct()
list.stream().distinct();
Stream流终结操作方法
对此流的每个元素执行操作
void forEach(Consumer action)
list.stream().forEach(System.out::println);
返回此流中的元素数
long count()
long count = list.stream().count();
System.out.println(count);
Stream流的收集操作
List<String> names = listStream.collect(Collectors.toList());Set<Integer> set = stream.collect(Collectors.toSet());Map<Integer, String> map = stream.collect(Collectors.toMap(s -> s, s -> 2 * s + ""));
求和
如果是 double 类型 注意会遇到精度问题。so 不建议 double 类型的用这个方法。
long sum = list.stream().mapToLong(e -> e /** 可以指定具体字段 */).sum();
List<Project> list = projectService.list(queryWrapper);
// 总投资数
Long totalInvestment = list.stream().mapToLong(Project::getTotalInvestment).sum();
实操
将集合中的某一列拿出来组合成新的集合
List<Integer> idList = userList.stream().map(OrderUser::getPlatformUserId).collect(Collectors.toList());
List 转 Set
Set<Integer> idSet = resourceObjectIdList.stream().collect(Collectors.toSet());
映射
map:接收Lambda , 将元素转换成其他形式或提取信息。接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。
flatMap:接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流。
List<Integer> list = Arrays.asList(13, 23, 99, 1889, 87, 1000, 88, 2, 99);List<Integer> collect = list.stream().map(i -> i + 1).collect(Collectors.toList());
// [14, 24, 100, 1890, 88, 1001, 89, 3, 100]
集合复制
List<CompanyChecks> checksList = //;
List<CompanyChecksNameVO> checksNameVOList = checksList.stream().map(p -> {CompanyChecksNameVO vo = new CompanyChecksNameVO();BeanUtils.copyProperties(p, vo);return vo;
}).collect(Collectors.toList());
排序
public void test(){//自然排序List<String> list = Arrays.asList("aaa", "eee", "ddd", "bbb");list.stream().sorted().forEach(System.out::println);//定制排序List<Person> list1 = Arrays.asList(new Person("张三", 18, 2000.0),new Person("李四", 18, 5000.0),new Person("王五", 45, 8700.0),new Person("赵六", 42, 4200.0),new Person("陈七", 56, 13100.0));list1.stream().sorted((p1,p2) -> {if (p1.getAge().equals(p2.getAge())){return p1.getSale().compareTo(p2.getSale());}else {return p1.getAge().compareTo(p2.getAge());}}).forEach(System.out::println);
}
List<Integer> list = Arrays.asList(13, 23, 99, 1889, 87, 1000, 88, 2, 99);
// 默认 顺序
List<Integer> collect = list.stream().sorted().collect(Collectors.toList());
// [2, 13, 23, 87, 88, 99, 99, 1000, 1889]// 定制排序:倒序
List<Integer> collect = list.stream().sorted((v1, v2) -> v2 - v1).collect(Collectors.toList());
// [1889, 1000, 99, 99, 88, 87, 23, 13, 2]
根据特定字段排序
正序
records = records.stream()
.sorted(Comparator.comparing(StudyReview::getReviewDate))
.collect(Collectors.toList());
倒序
records = records.stream()
.sorted(Comparator.comparing(StudyReview::getReviewDate).reversed())
.collect(Collectors.toList());
多个字段排序
list.stream().sorted(Comparator.comparing(User::getAge).thenComparing(User::getId).reversed()).forEach(System.out::println);
相关文章:
Java8 - Stream
介绍 Java8中有两大最为重要的改变。第一个是 Lambda 表达式; 另外一个则是 Stream API(java.util.stream.*)。Stream是 Java8中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用 Stream …...
什么样的冷链保温箱,既环保又实用?
冷链物流运输已经应用在了很多行业中,作为冷链物流运输中的重要设备——冷链保温箱,起到了举足轻重的作用。如果选择不当,选到了劣质产品,尤其是化学行业或者食品行业,就有可能造成试剂失效或者是影响粮食食品安全问题…...
Eclipse的介绍与安装
Eclipse简介 Eclipse 是一个开放源代码的,基于 Java 的可扩展开发平台。Eclipse官方版是一个集成开发环境(IDE),可以通过安装不同的插件实现对其它计算机语言编辑开发,如C、Php、Python等等。 Eclipse的下载 下载时需要访问网址 http://…...
<IBM AIX> 《AIX中HA的网卡IP确认方法》
《HA网卡确认方法》 1 HA IP地址类型2HA IP地址设置原则3 HA网卡日常查看方法3.1 查看hosts文件3.2 查看网卡和IP 4 通过命令方式直接查看5 直接查看HA配置4 HA网卡SMIT查看方法(暂不完整)4.1 根据hosts文件确认IP对应的别名4.2 根据serviceIP确认Persis…...
AMB300系列母线槽红外测温解决方案某锂电厂房项目案例分享
安科瑞 耿敏花 一、 行业背景 近年来,在国家政策引导与技术革新驱动的双重作用下,锂电产业保持快速增长态势,产业规模持续扩大,同时新能源产业工厂锂电池生产线对于电的依赖性很高,因而对供电设备的可靠性提出…...
go语言学习——4
文章目录 Map Map map是一种特殊的数据结构:一种元素对pair的无序集合,pair的一个元素是key,对应一个value,这种结构也称为“关联数组或字典”引用类型 map声明 var map1 map[keytype] valuetype var map1 map[string] intmap可以…...
vulnhub-RAVEN:2(MYSQL-UDF提权,手工提权/工具自动提权)
镜像下载:Raven: 2 ~ VulnHub 实验环境:kali:192.168.78.128 vulnhub镜像:192.168.78.133 1、kali查看本地ip地址,以便使用nmap扫描ip段存活主机 2、nmap扫描IP段,发现靶机的IP地址为192.168.78.133 4、访问…...
如何完整地掌握一个机器学习模型
如何完整地掌握一个机器学习模型 要全面地学习、掌握一个机器学习模型,可以遵循以下步骤: 基础理论学习:了解该模型的背后数学原理和推导过程,包括假设、损失函数、优化方法等。 学习算法实现:通过查阅论文、教程或…...
Nevron Open Vision for .NET 2022.3 Crack
Nevron Open Vision for .NET 适用于 Blazor、WPF、WinForms 和 Xamarin.Mac 的领先用户界面组件 Nevron Open Vision for .NET 是一套高级 UI 组件,可帮助您从单个代码库开发功能丰富的 Web (Blazor WebAssembly) 和桌面 (WinFor…...
【Linux】冯诺依曼体系结构以及操作系统的初步认知
🏖️作者:malloc不出对象 ⛺专栏:Linux的学习之路 👦个人简介:一名双非本科院校大二在读的科班编程菜鸟,努力编程只为赶上各位大佬的步伐🙈🙈 目录 前言一、冯诺依曼体系结构二、操…...
盖雅工场重磅发布「劳动力账户」,助力企业实现全面工时成本管理
2023年5月10日,亚太地区领先的劳动力管理云服务商盖雅工场宣布,在原有的智能排班和实时考勤系统基础之上,正式推出全新模块「劳动力账户」,通过为企业里的每一位员工建立劳动力账户,实现工时与成本的全面管控ÿ…...
数据结构与算法基础(青岛大学-王卓)(2)
第二弹火爆来袭中 这波是单链表的内容整理,废话不多说,上小龙虾呀(又到了龙虾季节了,哎,口水直流了~~) beautiful的分割线 文章目录 第二弹火爆来袭中这波是单链表的内容整理,废话不多说,上小龙虾呀(又到了…...
水产亚硝酸盐偏高解决办法,饮用水亚硝酸盐超标
使用常规的离子交换树脂处理含硫酸盐水中的硝酸盐是困难的。因为树脂几乎交换了水中的所有的硫酸盐后,才与水中的硝酸盐交换。也就是说,硫酸盐的存在会降低树脂对硝酸盐的去除能力。采用Tulsimer A-62MP除硝酸盐树脂优先交换硝酸盐,对硝酸盐的…...
linux 设备树详解
设备树 描述设备树的文件叫做 DTS(Device Tree Source),这个 DTS 文件采用树形结构描述板级设备,也就是开发板上的设备信息,比如CPU 数量、 内存基地址、IIC 接口上接了哪些设备、SPI 接口上接了哪些设备等等。 树的主干就是系统总线&#x…...
STM32 学习笔记_7 定时器中断:输出比较
输出比较 电机相关比较重要。 OC Output Compare(IC 是输入捕获,CC代指这两个单元),用于输出一定频率和占空比的PWM波形。 右下角四个就是CCR。只有通用计时器和高级计时器有,共用一个cnt计数器,高级计数…...
HTML购物车示例(勾选、删除、添加和结算功能)
以下是一个简单的HTML购物车示例,包含勾选、删除、添加和结算功能。结算功能使用PHP实现,可以获取选中商品的ID。 以下是一个简单的HTML购物车示例,包含勾选、删除、添加和结算功能。结算功能使用PHP实现,可以获取选中商品的ID以下…...
MySQL原理(十):主从架构
前言 上一篇介绍了 MySQL 的表分区和分库分表,这一篇将介绍主从架构相关的内容。 主从架构 常见的主从架构模式有四种: 一主多从架构:适用于读大于写的场景,采用多个从库来分担数据库系统的读压力。多主架构:适用于…...
一文了解Moonbeam智能合约
智能合约:区块链交易的基石 20世纪90年代,Nick Szabo首次提出智能合约的概念,这是一个建立在自动化、加密安全世界之上的数字化市场。在这种数字化市场中,交易和业务可以在无需信任的情况下进行,无需中间人。 以太坊…...
【加解密篇】利用HashCat破解RAR压缩包加密文件详细教程
【加解密篇】利用HashCat解密RAR压缩包加密文件 在取证知识里挖呀挖呀挖—【蘇小沐】 文章目录 【加解密篇】利用HashCat解密RAR压缩包加密文件1.实验环境2.RAR加密压缩包 (一)john软件1.使用CMD命令: run\rar2john.exe (二&…...
React面试题汇总1
1.React的严格模式如何使用,有什么用处? React中StrictMode严格模式_react.strictmode_前端精髓的博客-CSDN博客当我们使用 npx create-react-app my-app 创建一个项目的时候。项目中有一段如下所示的代码:ReactDOM.render( <React.Stric…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
