Stream流:

article/2025/10/19 8:20:43

创建stream流:

//单列集合
集合.stream//数组
stream.of(数组)//双列集合
map.entrySet().stream();

stream流的调试: 

 常用API:

- map:相当于对数据进行一个操作,可以自定义返回值等
stream.map()
- distinct:可以去除流中的相同元素,注意(*该方法依赖的Object的equals方法来判断是否是相同对象,所以要重写equals方法,否则只有对象地址一样时才会被认为是重复*)
- sorted:可以对流中的元素进行排序,传入空参时使用的是实体类的比较方法
- limit:设置流的最大长度,超出部分将被抛弃
- skip:跳过流中的前n个元素,返回剩下的元素
- **flatMap**:map能把一个对象转换成另外一个对象来作为流中的元素,而flatMap可以把一个对象转换成多个对象作为流中的元素
- 中间操作(filter,map,distinct,sorted,limit,skip,flatMap)
- 终结操作(forEach,collect,count,max,min,reduce归并,查找与匹配)
- forEach:遍历所有元素
- count:计算元素数量
- min&max:返回的是option对象,这里和sorted一样,得指定比较规则
- collect:把当前流转换成一个集合(list, set, map)- Collectors.toList()- Collectors.toSet()- Collectors.toMap(key, value)
- anyMatch:可以用来判断是否有任意符合匹配条件的元素,结果为boolean类型
- allMatch:可以用来判断是否都匹配条件,结果也是boolean类型,都符合则为true
- noneMatch:是否都不符合,都不符合则为true
- findAny:获取流中的任意一个元素,该方法无法保证获取的是流中的第一个元素,只是匹配到
- findFirst:获取流中的第一个元素
- reduce:对流中的数据按照你制定的计算方式计算出一个结果,并返回一个Optional描述归约值(如果有)

.map:

/**
*map:有两个参数,第一个参数表示传入的流,第二个表示输出的流
*可以把一个的对象类型的流变成String,int等其他类型的流
*也可以理解为把流中的类型转化成其他类型
*///map  Api匿名内部类的写法@Overridepublic ResponseEntity findAll() {List<User> all = myMapper.findAll();all.stream().map(new Function<User, Object>() {@Overridepublic Object apply(User user) {return user.getAge();}})//简化之后流的写法@Overridepublic ResponseEntity findAll() {List<User> all = myMapper.findAll();all.stream().map( user -> user.getAge()).forEach(a->System.out.println(a));// all.stream().map( 流中的元素 -> 获取这个元素的年龄输出).forEach(a->System.out.println(a));return ResponseEntity.ok(all);}
}

.filter

//条件过滤
List<User> collect = all.stream()
.filter(user -> user.id <=2&&user.getIncome().equals("20K"))//筛选id<=2,并且工资=20k的用户
.collect(Collectors.toList());

.distinct()

//去重
List<User> collect = all.stream().filter(user -> user.id <=2&&user.getIncome().equals("20K")).distinct()//对筛选出来的结果去重,用的equals方法比较.collect(Collectors.toList());

.sorted()//排序

List<User> collect = all.stream().filter(user -> user.id <=100).distinct()//对筛选出来的结果去重,用的equals方法比较.sorted()//排序.collect(Collectors.toList());//直接调用.sorted()排序是对Comparable对象进行排序,对象不一样就会报类型转换异常
//解决:
1.用对应的实体类实现Comparable<实体对象的泛型>接口-----重写compareto方法---定义排序方式如下实体类package com.liam.server.entiy;import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName(value = "tb_user_info")
public class User implements Serializable, Comparable<User>{@Overridepublic int compareTo(User o) {return this.getId()-o.getId();//默认升序}/*** id*/public int id;/*** 昵称*/public String nickname;/*** 用户头像*/public String avatar;/*** 用户标签:多个用逗号分隔*/public String tags;/*** 性别*/public String gender;/*** 年龄*/public String age;/*** 学历*/public String education;/*** 城市*/public String city;/*** 生日*/public String birthday;/*** 封面图片*/public String coverPic;/*** 行业*/public String profession;/*** 收入*/public String income;/*** 创建时间*/public String created;/*** 修改时间*/public String updated;/*** 结婚标识*/public String marriage;/*** 当前页*/@TableField(exist = false)public String page;/*** 当前页大小*/@TableField(exist = false)public String pageSize;}

.limit(n)//获取前n个

List<User> collect = all.stream().filter(user -> user.id <=100).distinct()//对筛选出来的结果去重,用的equals方法比较.sorted()//排序.limit(10)//只获取前10个.collect(Collectors.toList());

 .skip(2)//跳过前2个

 List<User> collect = all.stream().filter(user -> user.id <=100).distinct()//对筛选出来的结果去重,用的equals方法比较.sorted()//排序.skip(2)//跳过前2个.collect(Collectors.toList());

.flatmap//把对象的其中一个属性变成流操作

第一种用法:
//假设User对象有一个List<Book>集合属性,可以获取到这个集合中每个book的流/*** 用户标签:多个用逗号分隔*/List<Book> list//BOOK实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Book implements Serializable {private String colour;private String size;
}-----------------------------------------------------------------------------
List<String> collect = all.stream().filter(user -> user.id <=100).distinct()//对筛选出来的结果去重,用的equals方法比较.flatMap(user -> user.getBook().stream())//获取每一个book对象的strean流.map(book -> book.getColour())//获取到每本书的颜色.collect(Collectors.toList());第二种用法:
List<Integer> collect = all.stream().filter(user -> user.id <=100).distinct()//对筛选出来的结果去重,用的equals方法比较.flatMap(user -> Arrays.asList(user.getId()).stream())//获取对象中的一个属性变成数组,在生成的strean流,.collect(Collectors.toList());

.foreach

  all.stream().filter(user -> user.id <=100).distinct()//对筛选出来的结果去重,用的equals方法比较.flatMap(user -> Arrays.asList(user.getId()).stream())//获取对象中的一个属性变成数组,在生成的strean流,.forEach(integer -> System.out.println(integer));//遍历每一个对象进行操作

    .count();//计数

 long count = all.stream().filter(user -> user.id <= 100).distinct()//对筛选出来的结果去重,用的equals方法比较.flatMap(user -> Arrays.asList(user.getId()).stream())//获取对象中的一个属性变成数组,在生成的strean流,.count();//计数

.min/.max获取最大和最小值

//匿名内部类的写法 
Optional<Integer> max = all.stream().filter(user -> user.id <= 100).distinct()//对筛选出来的结果去重,用的equals方法比较.flatMap(user -> Arrays.asList(user.getId()).stream())//获取对象中的一个属性        变成数组,在生成的strean流,.max(new Comparator<Integer>() {//匿名内部类的写法,传入比较规则@Overridepublic int compare(Integer o1, Integer o2) {return  o1-o2;}});//lambda表达式写法Optional<Integer> max = all.stream().filter(user -> user.id <= 100).distinct()//对筛选出来的结果去重,用的equals方法比较.flatMap(user -> Arrays.asList(user.getId()).stream())//获取对象中的一个属性变成数组,在生成的strean流,.max((o1, o2) -> o1-o2);//lambda写法return ResponseEntity.ok(max);

 .collect

//转化list 
List<User> collect = all.stream().filter(user -> user.id <= 100).distinct()//对筛选出来的结果去重,用的equals方法比较.collect(Collectors.toList());//转化list//转化setSet<User> collect = all.stream().filter(user -> user.id <= 100).distinct()//对筛选出来的结果去重,用的equals方法比较.collect(Collectors.toSet());//转化set//转化mapMap<String, List<Book>> collect = all.stream().filter(user -> user.id <= 100).distinct()//对筛选出来的结果去重,用的equals方法比较//第一个参数指定kay,第二个参数指定values.collect(Collectors.toMap(user -> user.getAge(), user -> user.getBook()));//转化map

简单的API

.anyMatch//判断是否有复合的条件.allMatch//判断是否所有的条件都符合.noneMatch//判断是否所有的条件都不符合.findAny//获取流中的任意一个符合条件的元素--这个有任意性一般不用.findFirst//获取流中的第一个符合条件的元素

.reduce 把流中的元素按照指定方式计算出一个结果

//匿名内部类的写法all.stream().filter(user -> user.id <= 100).distinct()//对筛选出来的结果去重,用的equals方法比较.map(user -> user.getId()).reduce(0,new BinaryOperator<Integer>() {@Overridepublic Integer apply(Integer integer, Integer integer2) {return integer+integer2;//integer:初始值  integer2流中的每个元素  对着两个元素进行操作,然后赋值给integer在return}lamdba表达式写法://匿名内部类的写法,传入比较规则Integer reduce = all.stream().filter(user -> user.id <= 100).distinct()//对筛选出来的结果去重,用的equals方法比较.map(user -> user.getId()).reduce(0, (integer, integer2) -> { return integer + integer2;//integer:初始值  integer2流中的每个元素  对着两个元素进行操作,然后赋值给integer在return});//先用map进行转换,因为前边元素是什么样的,reduce就进行什么样的操作,所以1前边一般先用map进行类型转换在计算

并行流:

//首先并行流是线程安全的
//获取方式
1.stream.parallel()
2.数组.parallelStream()all.parallelStream()//获取并行流//.peek(user -> System.out.println(user.getId()+Thread.currentThread().getName())).filter(user -> user.id <= 100).distinct()//对筛选出来的结果去重,用的equals方法比较.map(user -> user.getId()).reduce(0, (integer, integer2) -> { return integer + integer2;//integer:初始值  integer2流中的每个元素  对着两个元素进行操作,然后赋值给integer在return});


http://chatgpt.dhexx.cn/article/7ZSe4RPH.shtml

相关文章

c++输出文件流ofstream用法详解

目录 一. 输入流 ofstream 用法 Public member functions (1-6) 1&#xff0c; (constructor) 2&#xff0c; ofstream::open 3&#xff0c; ofstream::is_open 4&#xff0c; ofstream::close 5&#xff0c; ofstream::rdbuf 6&#xff0c;ofstream::operator Public member …

C++文件和流

C文件和流 到目前为止&#xff0c;我们已经使用了 iostream 标准库&#xff0c;它提供了 cin 和 cout 方法分别用于从标准输入读取流和向标准输出写入流。 本教程介绍如何从文件读取流和向文件写入流。这就需要用到 C 中另一个标准库 fstream&#xff0c;它定义了三个新的数据…

什么是https

HTTPS&#xff08;全称&#xff1a;Hypertext Transfer Protocol over Secure Socket Layer&#xff09;&#xff0c;是以安全为目标的HTTP通道&#xff0c;简单讲是HTTP的安全版。即HTTP下加入SSL层&#xff0c;HTTPS的安全基础是SSL&#xff0c;因此加密的详细内容请看SSL。 …

http和https有什么区别 端口号多少

HTTP和HTTPS的基本概念 HTTP&#xff1a;超文本传输协议&#xff0c;是在互联网上应用最广泛的一种网络协议。是一个客户端和服务端请求和应答的标准&#xff08;TCP&#xff09;&#xff0c;用于从WWW&#xff08;超文本&#xff09;服务器传输超文本到本地浏览器的传输协议。…

https 请求的端口是443 注意

注意: 这里录制https的请求 端口号一定是443 才可以抓取到!!!!!! &#xff08;进坑多次&#xff09; 转载于:https://www.cnblogs.com/kaibindirver/p/9223595.html

IP地址,开放端口,http与https的区别

文章目录 一、IP地址的概述二、IP地址分类1、**共有地址**2、 **私有地址** 三、IPV4和V6四、子网掩码、网关、DNS1、 子网掩码2、网关3、DNS服务器 五、获取目标IP地址的方法1、 通过ping命令&#xff1a;2、 通过NSLOOKUP命令&#xff1a;1.使用资源监视器查看&#xff1a;2.…

Linux网络——图解HTTPS协议与端口号认识

Linux网络——图解HTTPS协议与端口号认识 一、确保HTTP安全的方式1.1 HTTP明文加密<1> 通信加密<2> 内容加密 1.2 验证通信方身份1.3 验证报文完整性&#xff0c;防止被篡改 二、HTTP加密认证完整性保护HTTPS2.1 SSL/TLS2.2 对称加密2.3 非对称加密2.4 混合加密 三…

什么是SSL端口?HTTPS配置技术指南

安全套接字层&#xff08;SSL&#xff09;是负责互联网连接的数据身份验证和加密的技术。它加密在两个系统之间&#xff08;通常在服务器和客户端之间&#xff09;之间通过互联网发送的数据&#xff0c;使其保持私密。随着在线隐私的重要性日益增加&#xff0c;您应该熟悉SSL端…

--端口--

目录 一、端口的读写 二、shl和shr指令 我们在之前所讲过&#xff0c;各种存储器都和CPU的地址线、数据线、控制线相连。CPU在操控它们的时候&#xff0c;把它们当做内存来看待&#xff0c;把它们总地看做一个由若干存储单元组成的逻辑存储器&#xff0c;这个逻辑存储器我们称…

服务器中如何检查端口是否开放

服务器中如何检查端口是否开放 端口对于一台服务器来说是至关重要的&#xff0c;它是服务器与外部网络设备的协议出口&#xff0c;它一共拥有65536个(0-65535)&#xff0c;其中一些端口已经是约定好什么协议在使用了的&#xff0c;像80端口就是web服务使用、3389端口是Windows远…

部署https证书的端口是什么意思

端口号能够觉得是机器设备与外部通信沟通交流的出入口。http的端口号为80&#xff0c;那么&#xff0c;你知不知道https证书的端口是什么吗&#xff1f;今日小编就来详细介绍下。 https证书的端口是什么 https证书布署安装&#xff0c;网络服务器必须关联端口号&#xff0c;一…

一分钟了解HTTP和HTTPS协议

很多人存在这样的疑惑就是http与https的区别&#xff0c;这篇文章就跟大家介绍一下。一句话总结HTTPS是身披SSL外壳的HTTP&#xff0c;HTTPS更安全&#xff0c;实际使用中绝大多数的网站现在都采用的是HTTPS协议&#xff0c;这也是未来互联网发展的趋势。 什么是协议&#xff1…

MVC5项目发布到IIS

1.右击项目&#xff0c;点击发布&#xff08;本人用的是vs2017&#xff09; 2 选择要发布的目标位置&#xff0c;简单说就是你想把发布生成的文件保存到哪里。本人在F盘建了个MVCPublishToIIS的文件夹。 发布方法选择文件系统(File System) 3 点击下一页继续 配置选择Release 发…

创建ASP.NET MVC5 应用程序

创建第一个ASP.NET MVC项目。使用Visual Studio 2017/2019创建ASP.NET MVC5应用程序&#xff0c;要求如下&#xff1a; &#xff08;1&#xff09;选择“MVC”模板&#xff0c;创建ASP.NET MVC应用程序。 &#xff08;2&#xff09;分别修改主页、关于我们及联系方式页面内容。…

[Asp.Net MVC5](一)- 理解MVC模式

1. MVC模式概念 MVC模式&#xff08;Model-View-Controller&#xff09;是软件工程中的一种软件架构模式&#xff0c;把软件系统分为以下三个基本部分&#xff1a; ◆Model封装了你的应用数据、应用流程和业务逻辑。“模型”有对数据直接访问的权力&#xff0c;例如对数据库的…

经验之谈 ---- ASP.NET应用程序MVC5模式下的简单实例项目

刚开始做ASP.NET应用程序的时候&#xff0c;自己一脸蒙B&#xff0c;具体的程序流程都不懂&#xff0c;所以自己打算写一个最简单的项目来看看ASP.NET MVC项目的具体流程。 若有写得不好的&#xff0c;还望指出. 目录结构如下图所示&#xff1a; 在企业中开发的时候需要自建A…

MVC5+EF6 入门完整教程五

上篇文章介绍了EF实现CRUD及一些基本的Html Helpers. 这次我们将会对之前的内容进行一些修改和重构&#xff1a; 引入Bootstrap样式&#xff0c;搭建几类共用的模板页&#xff0c;对UI进行一些改造 分类介绍Html Helpers 完善一些功能 文章提纲 理论基础 UI改造详细步骤 总结…

ASP.NET + MVC5 入门完整教程三 (下) ---MVC 松耦合

建立松耦合组件 MVC 模式最重要的特性之一视他支持关注分离&#xff0c;希望应用程序中的组件尽可能独立&#xff0c;只有很少的几个可控依赖项。在理想的情况下&#xff0c;每个组件都不了解其他组件&#xff0c;而只是通过抽象接口来处理应用程序的其他区域&#xff0c;这就…

MVC2 ,MVC3 ,MVC4,MVC5的区别

2010年發行ASP.NET MVC 2.0版&#xff0c;2011年發行ASP.NET MVC 3.0版&#xff0c;2012年發行ASP.NET MVC 4.0版 MVC3 需要.net framework 4.0 版本. 支持多视图引擎 在 ASP.NET MVC3 中&#xff0c;增加视图的对话框中允许你选择你希望的视图引擎&#xff0c;在新建项目…

MVC5+EF6 入门完整教程四

上篇文章主要讲了如何配置EF, 我们回顾下主要过程&#xff1a; 创建Data Model 创建Database Context 创建databaseInitializer配置entityFramework的context配置节。 对这个过程还有疑问的可以去上篇再看一下。 本次我们就主要讲解 (1) EF基本的CRUD (2) 涉及到的常用…