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

【stream的使用】使用stream.filter过滤List对象

Stream初相识
概括讲,可以将Stream流操作分为3种类型:

创建Stream
Stream中间处理
终止Steam
每个Stream管道操作类型都包含若干API方法,先列举下各个API方法的功能介绍。

开始管道
主要负责新建一个Stream流,或者基于现有的数组、List、Set、Map等集合类型对象创建出新的Stream流。

API 功能说明 stream() 创建出一个新的stream串行流对象
parallelStream() 创建出一个可并行执行的stream流对象
Stream.of() 通过给定的一系列元素创建一个新的Stream串行流对象

中间管道
负责对Stream进行处理操作,并返回一个新的Stream对象,中间管道操作可以进行叠加。

API 功能说明 filter() 按照条件过滤符合要求的元素, 返回新的stream流
map() 将已有元素转换为另一个对象类型,一对一逻辑,返回新的stream流
flatMap() 将已有元素转换为另一个对象类型,一对多逻辑,即原来一个元素对象可能会转换为1个或者多个新类型的元素,返回新的stream流
limit() 仅保留集合前面指定个数的元素,返回新的stream流 skip() 跳过集合前面指定个数的元素,返回新的stream流
concat() 将两个流的数据合并起来为1个新的流,返回新的stream流
distinct() 对Stream中所有元素进行去重,返回新的stream流
sorted() 对stream中所有的元素按照指定规则进行排序,返回新的stream流
peek() 对stream流中的每个元素进行逐个遍历处理,返回处理后的stream流

终止管道
顾名思义,通过终止管道操作之后,Stream流将会结束,最后可能会执行某些逻辑处理,或者是按照要求返回某些执行后的结果数据

API 功能说明 count()返回stream处理后最终的元素个数 max()返回stream处理后的元素最大值
min()返回stream处理后的元素最小值 findFirst()找到第一个符合条件的元素时则终止流处理
findAny()找到任何一个符合条件的元素时则退出流处理,这个对于串行流时与findFirst相同,对于并行流时比较高效,任何分片中找到都会终止后续计算逻辑
anyMatch()返回一个boolean值,类似于isContains(),用于判断是否有符合条件的元素
allMatch()返回一个boolean值,用于判断是否所有元素都符合条件 noneMatch()返回一个boolean值,
用于判断是否所有元素都不符合条件 collect()将流转换为指定的类型,通过Collectors进行指定 toArray()将流转换为数组
iterator()将流转换为Iterator对象 foreach()无返回值,对元素进行逐个遍历,然后执行给定的处理逻辑

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class StudentInfo  implements Comparable<StudentInfo> {//姓名private String name;//性别 true男 false女private Boolean sex;//年龄private Integer age;//身高,单位米private Double height;//出生日期private LocalDate birthday;@Overridepublic int compareTo(StudentInfo student) {return this.age.compareTo(student.getAge());}@Overridepublic String toString() {return String.format("%s\t\t%s\t\t%s\t\t%s\t\t%s",this.name, this.sex.toString(), this.age.toString(), this.height.toString(), birthday.toString());}/*** 打印学生信息的静态方法** @param studentList 学生信息列表*/public static void printStudentList(List<StudentInfo> studentList) {System.out.println("【姓名】\t\t【性别】\t\t【年龄】\t\t【身高】\t\t【生日】");System.out.println("-----------------------------------------------------");studentList.forEach(s -> System.out.println(s.toString()));System.out.println(" ");}}
class  testmain{public static void main(String[] args) {List<StudentInfo> studentList = new ArrayList<>();//使用builder添加数据studentList.add(StudentInfo.builder().name("李四明").sex(true).age(18).height(1.88).birthday( LocalDate.of(2007, 8, 30)).build());// 添加测试数据,请不要纠结数据的严谨性studentList.add(new StudentInfo("王五明", true, 23, 1.89, LocalDate.of(2000, 1, 16)));studentList.add(new StudentInfo("麻六的", false, 27, 1.75, LocalDate.of(1996, 9, 20)));studentList.add(new StudentInfo("刘七已", false, 30, 1.93, LocalDate.of(1993, 6, 19)));studentList.add(new StudentInfo("王八爬", false, 30, 1.75, LocalDate.of(1993, 6, 19)));// 输出没有过滤条件的学生列表StudentInfo.printStudentList(studentList);// 添加过滤条件,比如年龄小于25岁并且身高大于1米7的学生列表List<StudentInfo> ageHeightList = studentList.stream().filter(student -> student.getAge() < 25 && student.getHeight() > 1.7).collect(Collectors.toList());// 输出符合条件的学生列表StudentInfo.printStudentList(ageHeightList);//输出listStudentInfo.printStudentList(studentList);//从对象中提取age。并过滤年龄List<Integer>   nameList=studentList.stream().map(StudentInfo::getAge).filter(f->f>18).distinct().collect(Collectors.toList());nameList.forEach(System.out::println);}
}

相关文章:

【stream的使用】使用stream.filter过滤List对象

Stream初相识 概括讲&#xff0c;可以将Stream流操作分为3种类型&#xff1a; 创建Stream Stream中间处理 终止Steam 每个Stream管道操作类型都包含若干API方法&#xff0c;先列举下各个API方法的功能介绍。 开始管道 主要负责新建一个Stream流&#xff0c;或者基于现有的数组…...

Flink多流处理之connect拼接流

Flink中的拼接流connect的使用其实非常简单,就是leftStream.connect(rightStream)的方式,但是有一点我们需要清楚,使用connect后并不是将两个流给串联起来了,而是将左流和右流建立一个联系,作为一个大的流,并且这个大的流可以使用相同的逻辑处理leftStream和rightStream,也可以…...

对任意类型数都可以排序的函数:qsort函数

之前我们学习过冒泡排序&#xff1a; int main() {int arr[] { 9,7,8,6,5,4,3,2,1,0 };int sz sizeof(arr)/sizeof(arr[0]);int i 0;for (i 0; i < sz-1; i) {int j 0;for (j 0; j < sz-1-i; j) {if (arr[j] > arr[j 1]){int temp 0;temp arr[j];arr[j] ar…...

vue数据更新table内容不更新解决方法

场景&#xff1a; table组件绑定的数据变化时&#xff0c;页面没有重新渲染&#xff0c;常见于子组件中使用table组件 原理&#xff1a; 创建实例时 数组在vue中没有被监听到&#xff0c;属于非响应式数据&#xff0c;数组的下标变化无法监听到 解决方式&#xff1a; <e…...

合宙Air724UG LuatOS-Air script lib API--record

record Table of Contents record record.start(seconds, cbFnc, type, quality, rcdType, format, streamRptLen) record.stop(cbFnc) record.getFilePath() record.getData(offset, len) record.getSize() record.delete() record.exists() record.isBusy() record 模块功能&…...

基于Vgg16和Vgg19深度学习网络的步态识别系统matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022A 3.部分核心程序 ................................................................ % 设置训练选项options …...

Java分布式微服务3——Docker

文章目录 Docker介绍安装DockerDocker基础操作Docker服务的启动镜像命令容器命令1. 从docker hub去查看Nginx容器的运行命令2. 查看所有容器状态3. 查看容器日志4. 进入Nginx容器执行命令&#xff0c;修改Html内容&#xff0c;添加“Hello World”5. 停止与开始容器6. 删除容器…...

js字符串替换

在JavaScript中&#xff0c;字符串替换 有多种方法&#xff0c;下面介绍其中一些比较常用的方法。 使用replace()方法、 replace()方法用于在字符串中查…...

网络防御(2)

1. 什么是防火墙&#xff1f; 2. 状态防火墙工作原理&#xff1f; 3. 防火墙如何处理双通道协议&#xff1f; 一、什么是防火墙&#xff1f; 防火墙是一种网络安全设备或软件&#xff0c;用于保护计算机网络免受未经授权的访问&#xff0c;并管理网络流量。它作为一个安全边界…...

[RCTF2019]DontEatMe

前言 一道迷宫题&#xff0c;但是输入被加密后使用&#xff0c;迷宫也需要在程序中找出并没有直接输出 分析 反调试 发现有两个比较特殊的地方&#xff0c;随机数和创建了新线程&#xff0c;随机数后面又被重新赋值给覆盖了&#xff0c;暂时不用管&#xff0c;ZwSetInformat…...

6. CSS(三)

目录 一、盒子模型 &#xff08;一&#xff09;网页布局的本质 &#xff08;二&#xff09;盒子模型组成 &#xff08;三&#xff09;边框&#xff08;border&#xff09; &#xff08;四&#xff09;表格的细线边框 &#xff08;五&#xff09;内边距&#xff08;padding…...

计算机网络—HTTP

这里写目录标题 HTTP是什么HTTP常见状态码HTTP常见字段GET与POST的区别Get和Post是安全和幂等吗PUT幂等&#xff0c;不安全DELETE幂等&#xff0c;不是安全 HTTP缓存技术HTTP缓存实现技术 HTTP1.0优缺点和性能HTTP1.1优缺点和性能HTTP2优缺点和性能HTTP3优缺点和性能HTTP和HTTP…...

Tomcat线程池原理

1. 一个 SpringBoot 项目能同时处理多少请求&#xff1f;tomcat容器&#xff0c; 200 次。 2. 怎么来的&#xff1f; 而点击这些线程&#xff0c;查看其堆栈消息&#xff0c;可以看到 Tomcat、threads、ThreadPoolExecutor 等关键字 基于“短时间内有 200 个请求被立马处理…...

踩坑 视觉SLAM 十四讲第二版 ch13 编译及运行问题

一、安装Geset 库 sudo apt-get install libgtest-dev cd /usr/src/gtest sudo mkdir build cd build sudo cmake .. //一定要以sudo的方式运行&#xff0c;否则没有写入权限 sudo make //这个也一样要以sudo的方式 sudo cp libgtest*.a /usr/local/lib //将生成…...

【设计模式】-装饰器模式

Java 设计模式之装饰器模式 前言 在软件开发中&#xff0c;经常有需求对已有的对象进行功能的扩展&#xff0c;但是传统的继承方式会导致类的数量快速增多&#xff0c;且难以维护。为了解决这个问题&#xff0c;装饰器模式应运而生。 装饰器模式是一种结构型设计模式&#xff…...

七月学习总结

一晃暑期七月份已经结束了&#xff0c;八月份需要做的事情更多。 在成长的路上不断地迷茫&#xff0c;不断地前进。到底才能完成对自己地救赎。 目前想的就是以后走软件开发&#xff0c;往架构方向做&#xff0c;主语言Java或者go&#xff0c;408基础一定要扎实&#xff0c;计…...

Camunda 7.x 系列【6】Spring Boot 集成 Camunda 7.19

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 2.7.9 本系列Camunda 版本 7.19.0 源码地址:https://gitee.com/pearl-organization/camunda-study-demo 文章目录 1. 前言2. Camunda Platform Run3. Spring Boot 版本兼容性4. 集成 Spring Boot5. 启动项目…...

Kubernetes —调度器配置

目录 配置文件 扩展点 调度插件 多配置文件 应用于多个扩展点的插件 调度程序配置迁移 你可以通过编写配置文件&#xff0c;并将其路径传给 kube-scheduler 的命令行参数&#xff0c;定制 kube-scheduler 的行为。 调度模板&#xff08;Profile&#xff09;允许你配置 k…...

【微信小程序】申请蓝牙、位置和数据库等相关权限

在小程序的app.json文件中配置requiredPermissions字段&#xff0c;并在其中添加相应的权限。 以下是一个示例app.json文件的配置&#xff0c;包括了蓝牙、位置和数据库等权限的申请&#xff1a; {"pages": ["pages/index/index"],"requiredPermiss…...

ORB-SLAM2学习笔记6之D435i双目IR相机运行ROS版ORB-SLAM2并发布位姿pose的rostopic

文章目录 0 引言1 D435i相机配置2 新增发布双目位姿功能2.1 新增d435i_stereo.cc代码2.2 修改CMakeLists.txt2.3 新增配置文件D435i.yaml 3 编译运行和结果3.1 编译运行3.2 结果3.3 可能出现的问题 0 引言 ORB-SLAM2学习笔记1已成功编译安装ROS版本ORB-SLAM2到本地&#xff0c…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一&#xff1a;使用Read()读取文件2.3、方式二&#xff1a;bufio读取文件2.4、方式三&#xff1a;os.ReadFile读取2.5、写…...

【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权

摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题&#xff1a;安全。文章将详细阐述认证&#xff08;Authentication) 与授权&#xff08;Authorization的核心概念&#xff0c;对比传统 Session-Cookie 与现代 JWT&#xff08;JS…...