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

news/2024/11/29 20:50:35/

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);}
}

http://www.ppmy.cn/news/1011154.html

相关文章

ReactNative 学习笔记

学习使用的开发工具 编译器 VSCode 开发语言工具 TypeScript 重要程度分类 一般 这个程度的知识点主要是达到熟练掌握即可&#xff0c;不用太深入研究和学习。 重要 这个程度的知识点主要是达到熟练掌握&#xff0c;并且内部的原理切要熟记&#xff0c;因为会关联到其他的知…

【二分查找】74. 搜索二维矩阵

74. 搜索二维矩阵 解题思路 方法1 将二维数组转换为一维数组使用二分查找 class Solution {public boolean searchMatrix(int[][] matrix, int target) {// 使用二分查找// 将矩阵写入一个数组中 然后使用二分查找算法int[] a new int[matrix.length * matrix[0].length];i…

STM32--综述

文章目录 前言STM32简介STM32F103C8T6系统结构Keil软件安装注意事项新建工程操作流程 前言 本专栏将学习B站江协科技的STM32入门教程&#xff0c;通过自身理解和对老师的总结所写的博客专栏。 STM32简介 STM32是意法半导体&#xff08;STMicroelectronics&#xff09;公司推…

当进行一个npm包开发时,依赖管理的重要性

npm install 的时候会进行什么&#xff1f; 当一个项目被拉下来并执行npm install的时候&#xff0c;其实dependencies 和 devDependencies都会被安装。 如果项目有严格区分生产、开发环境的话&#xff0c;是可以通过--production来以只安装 dependencies 字段的模块。 作为…

用栈实现队列(JS)

用栈实现队列 题目 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; 实现 MyQueue 类&#xff1a; void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int…

jvm-程序计数器

1、是什么 4 学习路线 类加载器 内存结构方法区 类堆 对象虚拟机栈程序计数器本地方法栈 执行引擎解释器编译器 热点代码 5 程序计数器–作用 java源代码编译蛏二进制字节码 jvm指令。 对所有平台保持一致性。记住下一条jvm指令的执行地址。寄存器&#xff0c;cpu中读取速度…

Sublime Text 4 Build 4151 4152 发布及注册方法

Sublime Text 是一个商业代码编辑器。它原生支持许多编程语言和标记语言&#xff0c;用户可以通过插件来扩展它的功能&#xff0c;这些插件通常是由社区建立的&#xff0c;并以自由软件许可证的形式维护。为了方便插件&#xff0c;Sublime Text 有一个 Python API。 Sublime T…

React、Vue和Angular的优缺点

React React 是一个用于构建用户界面的 JAVASCRIPT 库。React 主要用于构建 UI&#xff0c;很多人认为 React 是 MVC 中的 V&#xff08;视图&#xff09;。React 起源于 Facebook 的内部项目&#xff0c;用来架设 Instagram 的网站&#xff0c;并于 2013 年 5 月开源。React …