系统讲解java中list.stream()的用法
在Java 8及以后的版本中,引入了新的Stream API,这个API提供了一组新的操作方法,可以便捷
地对Java集合进行过滤、映射、排序、分组等操作。
在Stream API中主要分中间操作,和终止操作
中间操作是对流进行处理但不产生最终结果的操作。中间操作可以被连续地串联起来形成一个操作流水线,最终由终止操作来触发流的执行。中间操作是懒执行的,只有在触发终止操作时,中间操作才会被执行,中间操作函数还有对应的子中间操作函数可调用
简单一句话就是Stream在中间操作流转变化,所以中间操作方法都是返回流
终止操作是用于触发流流水线执行并产生最终结果的操作。它会产生一个非流的结果,如集合、数组、单个元素或者副作用。终止操作是惰性求值的,也就是说,只有在调用终止操作时,中间操作才会被执行。这种设计可以实现更高效的数据处理,避免不必要的计算。
简单一句话就是Stream在终止操作决定返回什么值
常用的中间操作:
- filter:根据指定的条件对流中的元素进行过滤根据谓词(Predicate)对流中的元素进行筛选。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);List<Integer> filteredNumbers = numbers.stream().filter(n -> n % 2 == 0) // 筛选出偶数.collect(Collectors.toList()); - map:对流中的每个元素应用一个函数,将其映射为另一个元素。方法需要传函数式接口
Function类型的参数,该函数接受一个输入元素,并返回一个经过映射处理后的输出元素流。 - flatMap:将流中的每个元素映射为一个流,然后将这些流扁平化为一个新的流。方法需要传递一个
Function类型的参数,该函数接受一个元素作为输入,并返回一个包含多个元素的流List<String> words = Arrays.asList("Hello", "World", "Java");List<Character> letters = words.stream().flatMap(word -> word.chars().mapToObj(c -> (char) c)).collect(Collectors.toList());System.out.println(letters); //输出[H, e, l, l, o, W, o, r, l, d, J, a, v, a] - distinct:去除流中重复的元素。
- sorted:对流中的元素进行排序。参数
Comparator返回流sorted(Comparator.comparing(类型名称::类型属性))//默认数字排序和按照字母顺序排序 - peek:对流中的每个元素执行一些操作,接受一个
Consumer参数,如打印或调试。注意peek方法不能用于修改元素 - limit:限制从流中获取的元素数量。
- skip:跳过流中的前几个元素。
- takeWhile:从流中获取满足指定条件的元素,遇到第一个不满足条件的元素就停止获取。根据谓词(Predicate)对流中的元素进行筛选注意Java9开始使用
- dropWhile:跳过从流中满足指定条件的元素,遇到第一个不满足条件的元素开始获取。根据谓词(Predicate)对流中的元素进行筛选注意Java9开始使用
常用的终止操作:
- collect:将流中的元素收集到一个集合或者单个对象中。
- forEach:对流中的每个元素执行指定的操作。无返回值只改变当前集合
- reduce:根据某个规约操作(如求和、求最大值等)来合并流中的元素,最终将流归约为一个值或一个 Optional 对象。例子:使用reduce操作传入初始值0和一个Lambda表达式作为累加器函数。Lambda表达式接收两个参数a和b,相加后返回结果。reduce操作从流的第一个元素开始,将该元素作为初始值,然后针对列表中的每个元素依次执行累加器函数。最终得到所有元素的累加和(这里的计算相当于调用sum函数)
int sum = numbers.stream().reduce(0, (a, b) -> a + b); - count:返回流中元素的数量。返回long
- max/min:返回流中的最大值/最小值。参数
Comparator返回Optional对象List<Integer> numbers = Arrays.asList(1, 10, 5, 8, 3);Optional<Integer> max = numbers.stream()//如果流为空,则返回一个空的 Optional 对象.max(Comparator.naturalOrder());//Comparator.naturalOrder() 比较器,该比较器使用元素的自然顺序进行比较。// 输出 10 max.ifPresent(System.out::println);//ifPresent 方法判断结果是否存在,如果存在则打印最大值。 - anyMatch/allMatch/noneMatch:判断流中的元素是否满足某个条件。参数谓词(Predicate)返回布尔值
- findFirst/findAny:找到流中的第一个元素或者任意元素。方法返回一个 Optional 对象(findAny是随机取)
- toArray:将流中的元素转换为数组。
- sum:求和返回对应中间函数调用的数据类型 如
List<Student> students = Arrays.asList(new Student("Tom", 80),new Student("Jerry", 90),new Student("Mickey", 70) );int sum = students.stream().mapToInt(Student::getScore)//这里和map传的FUNCTION类型参数.sum();
理解这些操作还需要理解几个名词
1.谓词(Predicate): 谓词是一个函数接口,它接受一个参数并返回一个布尔值。一般用于filter,takeWhile与dropWhile
2.Consumer : Consumer 是一个函数式接口,在 Java 中属于 java.util.function 包下。它定义了一个具有一个输入参数的操作,并且没有返回值。一般用于forEach与peek
Consumer 接口有一个抽象方法 accept(T t),该方法接受一个输入参数,并且对该参数进行处理操作。
3.Comparator:Comparator是Java中用于比较对象的接口。它定义了比较两个对象的规则,用于在排序、查找等操作中确定对象的顺序。一般用于sorted ,max,min
Comparator接口有一个用于比较的方法:compare(T obj1, T obj2)。该方法接受两个参数,并返回一个整数值,表示比较结果的大小关系。
4.函数式接口 Function 类型的参数,该接口接受一个输入元素,并返回指定类型的元素流。
一般用于map, flatMap 等map相关函数
5.归约(reduce)操作 其中最常用的形式接受一个二元操作符(BinaryOperator)作为参数,来完成归约操作,这个下篇文章写
相关文章:
系统讲解java中list.stream()的用法
在Java 8及以后的版本中,引入了新的Stream API,这个API提供了一组新的操作方法,可以便捷 地对Java集合进行过滤、映射、排序、分组等操作。 在Stream API中主要分中间操作,和终止操作 中间操作是对流进行处理但不产生最终结果的…...
字节面试:请说一下DDD的流程,用电商系统为场景
说在前面 在40岁老架构师 尼恩的读者交流群(50)中,最近有小伙伴拿到了一线互联网企业字节、如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格,遇到很多很重要的面试题: 谈谈你的DDD落地经验? 谈谈你对DDD的理解&…...
第26章_事务概述与隔离级别
文章目录 事务事务的特征事务的控制语句事务的生命周期事务的执行过程 ACID特性原子性一致性隔离性持久性 隔离级别不同隔离级别并发异常脏读不可重复读幻读区别 总结 事务 (1)事务的前提:并发连接访问。MySQL的事务就是将多条SQL语句作为整…...
合肥工业大学网络安全实验IP-Table
✅作者简介:CSDN内容合伙人、信息安全专业在校大学生🏆 🔥系列专栏 :hfut实验课设 📃新人博主 :欢迎点赞收藏关注,会回访! 💬舞台再大,你不上台,永远是个观众。平台再好,你不参与,永远是局外人。能力再大,你不行动,只能看别人成功!没有人会关心你付出过多少…...
Docker本地镜像发布到阿里云或私有库
本地镜像发布到阿里云流程 : 1.自己生成个要传的镜像 2.将本地镜像推送到阿里云: 阿里云开发者平台:开放云原生应用-云原生(Cloud Native)-云原生介绍 - 阿里云 2.1.创建仓库镜像: 2.1.1 选择控制台,进入容器镜像服…...
使用openvc进行人脸检测:Haar级联分类器
1 人脸检测介绍 1.1 什么是人脸检测 人脸检测的目标是确定图像或视频中是否存在人脸。如果存在多个面,则每个面都被一个边界框包围,因此我们知道这些面的位置 人脸检测算法的主要目标是准确有效地确定图像或视频中人脸的存在和位置。这些算法分析数据…...
Netty心跳检测
文章目录 一、网络连接假死现象二、服务器端的空闲检测三、客户端的心跳报文 客户端的心跳检测对于任何长连接的应用来说,都是一个非常基础的功能。要理解心跳的重要性,首先需要从网络连接假死的现象说起。 一、网络连接假死现象 什么是连接假死呢&…...
【leaflet】1. 初见
▒ 目录 ▒ 🛫 导读需求开发环境 1️⃣ 概念概念解释特点 2️⃣ 学习路线图3️⃣ html示例🛬 文章小结📖 参考资料 🛫 导读 需求 要做游戏地图了,看到大量产品都使用的leaflet,所以开始学习这个。 开发环境…...
数据结构与算法(Java版) | 详解十大经典排序算法之一:冒泡排序
前面虽然大家已经知道了多种不同的排序算法,但是我一直都没来得及给大家讲,所以,从这一讲起,我就要开始来给大家详细讲解具体的这些排序算法了。 下面,我们先来看第一个最常见的排序,即冒泡排序。 冒泡排…...
轻量封装WebGPU渲染系统示例<24>- Rendering Pass Graph基本用法(源码)
当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/PassNodeGraphTest.ts 此示例基于此渲染系统实现,当前示例TypeScript源码如下: class PassGraph extends WGRPassNodeGraph {constructor() { super();…...
开设自己的网站系类01购买服务器
开始建设自己的网站吧! 编者买了一个服务器打算自己构建一个网站,用于记录生活。网站大概算是一个个人博客吧。记录创建过程的一些步骤 要开设自己的网站,需要执行以下关键步骤 以下只是初步列出了建立自己的网站的大概步骤,后…...
FTP、NFS、SAMBA系统服务一
一、rsync托管xinetd 1、为什么要进行服务托管 独立服务:独立启动脚本 ssh ftp nfs dns ... 依赖服务: 没有独立的启动脚本 rsync telnet 依赖xinetd服务(独立服务) 2、如何将rsync托管给xinetd服务去管理? 第一步࿱…...
transfomer模型——简介,代码实现,重要模块解读,源码,官方
一、什么是transfomer Transformer是一种基于注意力机制(attention mechanism)的神经网络架构,最初由Vaswani等人在论文《Attention Is All You Need》中提出。它在自然语言处理(NLP)领域取得了巨大成功,特…...
队列(Queue):先进先出(FIFO)的数据结构
队列是一种基本的数据结构,用于在计算机科学和编程中管理数据的存储和访问。队列遵循先进先出(First In, First Out,FIFO)原则,即最早入队的元素首先出队。这种数据结构模拟了物理世界中的队列,如排队等待服…...
吃透 Spring 系列—AOP部分
目录 ◆ AOP 简介 - AOP的概念 - AOP思想的实现方案 - 模拟AOP的基础代码 - AOP相关概念 ◆ 基于xml配置的AOP - xml方式AOP快速入门 - xml方式AOP配置详解 - xml方式AOP原理剖析 ◆ 基于注解配置的AOP - 注解方式AOP基本使用 - 注解方式AOP配置详解 - 注解…...
redis 问题解决 2
1.4 数据存储 1、Redis 的数据过期策略是什么? Redis的数据过期策略包括两种机制:被动删除和主动删除。 被动删除: 当某个键被访问时,如果发现这个键已经过期,Redis会立即删除这个键。这意味着如果一个过期的键从未被访问,它就不会被自动删除。这是一种惰性删除策略。主…...
Spring Boot 校验用户上传的图片文件
图片上传是现代应用中非常常见的一种功能,也是风险比较高的一个地方。恶意用户可能会上传一些病毒、木马。这些东西不仅严重威胁服务器的安全还浪费了带宽,磁盘等资源。所以,在图片上传的接口中,一定要对用户上传的文件进行严格的…...
【springboot配置项动态刷新】与【yaml文件转换为java对象】
文章目录 一,序言二,准备工作1. pom.xml引入组件2. 配置文件示例 三,自定义配置项动态刷新编码实现1. 定义自定义配置项对象2. 添加注解实现启动时自动注入3. 实现yml文件监听以及文件变化处理 四,yaml文件转换为java对象1. 无法使…...
JS移动端触屏事件
在我们PC端中有许多的事件,那我们在移动端有没有事件呢?让我为大家介绍一下移动端常用的事件,触屏事件 触屏事件 touch (也称触摸事件),Android 和IOS 都有 touch 对象代表一个触摸点。触摸点可能是一根手指,也可能是一…...
C语言——打印1000年到2000年之间的闰年
闰年: 1、能被4整除不能被100整除 2、能被400整除 #define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int year;for(year 1000; year < 2000; year){if((year%4 0) && (year%100!0) || (year%400 0)){printf("%d ",ye…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...
Vue 3 + WebSocket 实战:公司通知实时推送功能详解
📢 Vue 3 WebSocket 实战:公司通知实时推送功能详解 📌 收藏 点赞 关注,项目中要用到推送功能时就不怕找不到了! 实时通知是企业系统中常见的功能,比如:管理员发布通知后,所有用户…...
Python爬虫实战:研究Restkit库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的有价值数据。如何高效地采集这些数据并将其应用于实际业务中,成为了许多企业和开发者关注的焦点。网络爬虫技术作为一种自动化的数据采集工具,可以帮助我们从网页中提取所需的信息。而 RESTful API …...
前端工具库lodash与lodash-es区别详解
lodash 和 lodash-es 是同一工具库的两个不同版本,核心功能完全一致,主要区别在于模块化格式和优化方式,适合不同的开发环境。以下是详细对比: 1. 模块化格式 lodash 使用 CommonJS 模块格式(require/module.exports&a…...
