java-----Stream流

什么是Stream?

Stream将要处理的元素集合看作一种流,在流的过程中,借助Stream API对流中的元素进行操作,比如:筛选、排序、聚合等

Stream流的作用:

结合了Lambda表达式,简化集合、数组的操作

Stream流的使用步骤:

        ①先得到一条Stream流(流水线),并把数据放上去

        ②利用Stream流中的API进行各种操作:比如

中间方法:(过滤、转换) 方法调用完毕之后,还可以调用其他方法

终结方法:(统计、打印) 最后一步,调用完毕之后,不能调用其它方法

总的来说三步:

        1.先得到一条Stream流(流水线),并把数据放上去

        2.使用中间方法对流水线上的数据进行操作

        3.使用终结方法对流水线上的数据进行操作

让我们来一步步介绍

①得到一条Stream流(流水线),并把数据放上去

获取方式方法名说明
单列集合default Stream<E>stream()Collection中的默认方法
双列集合无法直接使用Stream流
数组public static<T>Stream<T>stream(T[]array)Arrays工具类中的静态方法
一堆零散数据public static<T>Stream<T>of(T...values)Stream接口中的静态方法

方法演示:       

package StreamDemo;import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.function.Consumer;
import java.util.stream.Stream;public class demo1 {public static void main(String[] args) {ArrayList<String> list=new ArrayList<>();Collections.addAll(list,"a","b","c","d","e");Stream<String> stream = list.stream();//ctrl+v自动生成左边list.stream().forEach(s->{System.out.println(s);});//双列集合获取Stream流时必须利用keySet()或者entrySet()方法获取单列集合,然后再获取流HashMap<String,Integer> hm=new HashMap<>();hm.put("aaa",111);hm.put("bbb",222);hm.keySet().stream().forEach(s->System.out.println(s));hm.entrySet().stream().forEach(s->System.out.println(s.getKey()));int []arr={1,2,3,4,5,6};Arrays.stream(arr).forEach(s->System.out.println(s));//Stream接口中静态方法of的细节//方法形参是一个可变参数,可以传递一堆零散数据,也可以传递数组//但是数组必须是引用数据类型,如果传递基本数据类型,会把整个数组当作一个元素,放入Stream中Stream.of(arr).forEach(s->System.out.println(s));String []arr2={"a","b","c"};Stream.of(arr2).forEach(s->System.out.println(s));}
}

运行结果:
aaa
bbb
aaa
bbb
1
2
3
4
5
6
[I@7699a589
a
b
c

②使用中间方法对流水线上的数据进行操作

名称说明
Stream<T>filter(Predicate<?super T>) predicate过滤
Stream<T>limit(long maxSize)获取前几个元素
Stream<T>skip(long n)跳过前几个元素
Stream<T>distinct元素去重
static<T>Stream<T>concat(Stream a,Stream b)合并a和b为一个流
static<R>map(Function<T,R> mapper)转换流中的数据类型

注意1:中间方法,返回新的Stream流,原来的Stream流只能使用一次,建议使用链式编程

注意2:修改Stream流中数据,不会影响原来的集合或者数组中的数据

代码演示:

package StreamDemo;import java.util.ArrayList;
import java.util.Collections;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Stream;public class demo3 {public static void main(String[] args) {ArrayList<String> list=new ArrayList<>();Collections.addAll(list,"张无忌","周芷若","赵敏","张强","张三丰","张翠三","张良","王二麻子","谢广坤");//1.filter 过滤,把张开头的留下,其余过滤不变System.out.print("filter:把张开头的留下");Stream<String> stream = list.stream();stream.filter(new Predicate<String>() {@Overridepublic boolean test(String s) {//如果为true,则把当前数据的留下//如果为false,则把当前数据舍弃return s.startsWith("张");}}).forEach(s->System.out.print(s+" "));System.out.println();//把姓张且长度为3进行过滤//以下的方法会报错 stream has already been operated upon or closed :正好验证了注意1:中间方法,返回新的Stream流,原来的Stream流只能使用一次,建议使用链式编程//stream.filter(s->s.length()==3).forEach(s->System.out.println(s));//那么我们试试链式编程System.out.print("filter链式编程:");list.stream().filter(s->s.startsWith("张")).filter(s->s.length()==3).forEach(s->System.out.print(s+" "));System.out.println();System.out.print("集合里面的数据:");System.out.println(list);//注意2:修改Stream流中数据,不会影响原来的集合或者数组中的数据//limit 获取前三个元素System.out.print("limit 获取前三个元素");list.stream().limit(3).forEach(s->System.out.print(s+" "));System.out.println();System.out.print("skip 跳过前几个元素:");list.stream().skip(3).forEach(s->System.out.print(s+" "));System.out.println();System.out.print("去重之后:");ArrayList<String> list2=new ArrayList();Collections.addAll(list2,"张无忌","张无忌","张无忌","张无忌","张无忌","张无忌","张无忌","王二麻子","谢广坤");//distinct 去重 看源码可以知道distinct底层时hashSetlist2.stream().distinct().forEach(s->System.out.print(s+" "));//concat 合并两个流System.out.println("concat 合并两个流:");Stream.concat(list.stream(),list2.stream()).forEach(s->System.out.print(s+" "));System.out.println();//map转换流中的数据类型System.out.print("stream.map转换数据类型 获取集合中的年龄:");ArrayList<String> list3=new ArrayList<>();Collections.addAll(list3,"张无忌-13","周芷若-14","赵敏-15","张强-16","张三丰-15");list3.stream().map(new Function<String, Integer>() {//函数式接口@Overridepublic Integer apply(String s) {String []arr=s.split("-");int x=Integer.parseInt(arr[1]);return x;}}).forEach(s->System.out.print(s+" "));System.out.println();}
}

 运行结果:

filter:把张开头的留下张无忌 张强 张三丰 张翠三 张良 
filter链式编程:张无忌 张三丰 张翠三 
集合里面的数据:[张无忌, 周芷若, 赵敏, 张强, 张三丰, 张翠三, 张良, 王二麻子, 谢广坤]
limit 获取前三个元素张无忌 周芷若 赵敏 
skip 跳过前几个元素:张强 张三丰 张翠三 张良 王二麻子 谢广坤 
去重之后:张无忌 王二麻子 谢广坤 concat 合并两个流:
张无忌 周芷若 赵敏 张强 张三丰 张翠三 张良 王二麻子 谢广坤 张无忌 张无忌 张无忌 张无忌 张无忌 张无忌 张无忌 王二麻子 谢广坤 
stream.map转换数据类型 获取集合中的年龄:
13 14 15 16 15 
 

 ③Stream流中的终结方法

名称        说明
void forEach(Consumer action)遍历
long count()统计
toArray()收集流中的数据,放到数组中
collect(Collector collector)收集流中的数据,放到集合中

package StreamDemo;import java.util.*;
import java.util.function.Function;
import java.util.function.IntFunction;
import java.util.function.Predicate;
import java.util.stream.Collectors;public class demo4 {public static void main(String[] args) {System.out.println("forEach获取流中的每一个数据");ArrayList<String> list=new ArrayList<>();Collections.addAll(list,"张无忌","周芷若","赵敏","张强","张三丰","张翠三","张良","王二麻子","谢广坤");list.stream().forEach(s->System.out.print(s+" "));System.out.println();System.out.println("count统计流中的数据个数:");System.out.print(list.stream().count());System.out.println();System.out.println("收集流中的数据,放到数组里");//apply的形参:流中数据的个数String []arr=list.stream().toArray(new IntFunction<String[]>() {@Overridepublic String[] apply(int value) {return new String[value];}});System.out.print(Arrays.toString(arr));System.out.println();ArrayList<String> list3=new ArrayList<>();Collections.addAll(list3,"张无忌-13-男","周芷若-14-女","赵敏-15-女","张强-16-男","张三丰-15-男","张三丰-15-男");System.out.println("collect方法收集流中的数据并把其放入集合中");//获取到所有的男性,并把其放到集合中List<String> list4=list3.stream().filter(new Predicate<String>() {@Overridepublic boolean test(String s) {return s.split("-")[2].equals("男");}}).collect(Collectors.toList());System.out.println("收集到list集合中:"+list4);//放入Set集合Set<String> set=list3.stream().filter(new Predicate<String>() {@Overridepublic boolean test(String s) {return s.split("-")[2].equals("男");}}).collect(Collectors.toSet());System.out.println("收集到set集合中:"+set);//收集到map集合中 键姓名 值男性/*toMap:参数一表示键的生成规则参数二表示值的生成规则参数一:Function泛型一:表示流中每一个数据的类型泛型二:表示map集合中键的数据类型方法apply形参:依次表示流里面的每一个数据方法体:生成键的代码返回值:已经生成的键参数二:Function泛型一:表示流中每一个数据的类型泛型二:表示map集合中值的数据类型方法apply形参:依次表示流里面的每一个数据方法体:生成值的代码返回值:已经生成的值*/ArrayList<String> list5=new ArrayList<>();Collections.addAll(list5,"张无忌-13-男","周芷若-14-女","赵敏-15-女","张强-16-男","张三丰-15-男");//注意点//键不能重复,不然会报错Map<String,String> map=list5.stream().filter(new Predicate<String>() {@Overridepublic boolean test(String s) {return s.split("-")[2].equals("男");}}).collect(Collectors.toMap(new Function<String, String>() {@Overridepublic String apply(String s) {return s.split("-")[0];}}, new Function<String, String>() {@Overridepublic String apply(String s) {return s.split("-")[2];}}));//写键的规则和值的规则System.out.println("收集到,map集合中:"+map);}}

 运行结果:

forEach获取流中的每一个数据
张无忌 周芷若 赵敏 张强 张三丰 张翠三 张良 王二麻子 谢广坤 
count统计流中的数据个数:
9
收集流中的数据,放到数组里
[张无忌, 周芷若, 赵敏, 张强, 张三丰, 张翠三, 张良, 王二麻子, 谢广坤]
collect方法收集流中的数据并把其放入集合中
收集到list集合中:[张无忌-13-男, 张强-16-男, 张三丰-15-男, 张三丰-15-男]
收集到set集合中:[张强-16-男, 张三丰-15-男, 张无忌-13-男]
收集到,map集合中:{张强=男, 张三丰=男, 张无忌=男}

内容来自Stream流-02-Stream流的思想和获取Stream流_哔哩哔哩_bilibili

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/149485.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

CSS文档流以及脱离文档流的方法

文档流 文档流是文档中可显示对象在排列时占用的位置/空间。例如&#xff1a;块元素自上而下摆放&#xff0c;内联元素从左到右摆放。&#xff08;文档流中限制非常的多&#xff0c;导致很多页面效果无法实现)。 常见文档流限制 高低不齐&#xff0c;底边对齐 <head>&…

机器学习之概念1

今天去上机器学习的课&#xff0c;其中我觉得可以套用之前学的强化学习&#xff0c;其中P是评估&#xff0c;T是任务&#xff0c;E是经验&#xff0c;就是利用经验来提高相关的评估任务&#xff0c;从数据中学习&#xff0c;从统计机器中学习&#xff0c;其中可以分为有监督的机…

大型语言模型(Large Language Models)的介绍

背景 大型语言模型&#xff08;Large Language Models&#xff0c;简称LLMs&#xff09;是一类先进的人工智能模型&#xff0c;它们通过深度学习技术&#xff0c;特别是神经网络&#xff0c;来理解和生成自然语言。这些模型在自然语言处理&#xff08;NLP&#xff09;领域中扮…

MySQL | 实战 | 4 种将数据同步到ES方案

文章目录 1. 前言2. 数据同步方案2.1 同步双写2.2 异步双写2.3 定时更新2.4 基于 Binlog 实时同步 3. 数据迁移工具选型3.1 Canal3.2 阿里云 DTS3.3 Databus3.4 Databus和Canal对比3.4 其它 4. 后记 上周听到公司新同事分享 MySQL 同步数据到 ES 的方案&#xff0c;发现很有意思…

独立游戏《Project:Survival》UE5C++开发日志0——游戏介绍

该游戏是《星尘异变》团队的下一款作品&#xff0c;太空科幻题材的生存游戏&#xff0c;我将负责使用C、蓝图实现游戏的基础框架和核心功能&#xff0c;其中还包含使用人工智能算法助力游戏开发或帮助玩家运营 目前已有功能&#xff1a; 1.3D库存系统&#xff1a;所有库存中的物…

【运维监控】influxdb 2.0 + grafana 11 监控jmeter 5.6.3 性能指标(完整版)

运维监控系列文章入口&#xff1a;【运维监控】系列文章汇总索引 文章目录 一、部署influxdb2.0二、部署grafana三、jmeter配置1、下载jmeter插件2、部署jmeter插件3、添加Backend Listener 四、grafana集成influxdb监控jmeter1、建立grafana数据源2、导入grafana模板3、验证1&…

秒表【JavaScript】

这个代码实现了一个基本的功能性秒表。 实现功能&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-sc…

文档矫正算法:DocTr++

文档弯曲矫正&#xff08;Document Image Rectification&#xff09;的主要作用是在图像处理领域中&#xff0c;对由于拍摄、扫描或打印过程中产生的弯曲、扭曲文档进行校正&#xff0c;使其恢复为平整、易读的形态。 一. 论文和代码 论文地址&#xff1a;https://arxiv.org/…

Android NestedScrollView+TabLayout+ViewPager+ 其它布局,ViewPager 不显示以及超出屏幕不显示问题

前言 此场景为 NestedScrollView 嵌套多个布局 &#xff0c;大致结构为 NestedScrollViewTabLayoutViewPagerfragment 其它View,如下图 &#xff0c; 一、ViewPager 设置高度才会显示内容问题 原因&#xff1a;NestedScrollView 计算高度先于 ViewPager 渲染前&#xff0c;所…

动手学深度学习8.7. 通过时间反向传播-笔记练习(PyTorch)

本节课程地址&#xff1a;本节无视频 本节教材地址&#xff1a;8.7. 通过时间反向传播 — 动手学深度学习 2.0.0 documentation (d2l.ai) 本节开源代码&#xff1a;...>d2l-zh>pytorch>chapter_multilayer-perceptrons>bptt.ipynb 通过时间反向传播 到目前为止&…

输出Hate-C语言

1.问题&#xff1a; C语言实现先后输出Hate四个字符。 2.解答&#xff1a; 定义4个字符变量&#xff0c;分别赋以初值H、a、t、e&#xff0c;然后用putchar函数输出4个字符变量的值。 3.代码&#xff1a; #include<stdio.h>int main(){char character1,character2,ch…

ArcGIS Desktop使用入门(三)图层右键工具——拓扑(下篇:地理数据库拓扑)

系列文章目录 ArcGIS Desktop使用入门&#xff08;一&#xff09;软件初认识 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——标准工具 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——编辑器 ArcGIS Desktop使用入门&#xff08;二&#x…

CSS中的多种关系选择器

后代选择器 选择所有被E元素包含的F元素&#xff0c;中间用空格隔开。 例&#xff1b; <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title…

使用Docker一键部署Blossom笔记软件

Blossom 是一个需要私有部署的笔记软件,虽然本身定位是一个云端软件,但你仍然可以在本地部署,数据和图片都将保存在你的设备,不依赖任何的图床或者对象存储。 客户端:支持 Windows 端和 ARM 架构的 Mac 端,以及作为网页端部署。移动端:响应式网页移动端,主要为移动端设…

基于单片机的智能窗帘控制系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;采用DHT11温湿度传感器检测温湿度&#xff0c;滑动变阻器连接ADC0832数模转换器转换模拟,光敏传感器&#xff0c;采用GP2D12红外传感器&#xff0c;通过LCD1602显示屏显示…

3DMAX乐高建筑生成器插件LegoBuilding使用方法详解

3DMAX乐高建筑生成器插件LegoBuilding使用教程 3DMAX乐高建筑生成器插件LegoBuilding&#xff0c;一键批量生成随机的乐高积木样式建筑群&#xff0c;可作为配景楼建模使用。可根据闭合样条线画定范围或地形&#xff08;网格&#xff09;对象表面范围和起伏批量生成随机形状的乐…

浮游生物检测系统源码分享

浮游生物检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

使用【Sa-Token】实现Http Basic 认证

使用Sa-Token开源架构快速实现Http Basic 认证&#xff0c;如上图 1、springboot环境下直接添加starter即可 <!-- Sa-Token 权限认证&#xff0c;在线文档&#xff1a;https://sa-token.cc --> <dependency><groupId>cn.dev33</groupId><artifactI…

04-Docker常用命令

04-Docker常用命令 启动类命令 启动docker systemctl start docker停止docker systemctl stop docker重启docker systemctl restart docker查看docker状态 systemctl status docker开机启动docker systemctl enable docker帮助类命令 查看docker版本 docker version查…

ubuntu中如何查看类型(函数)定义的头文件

问题&#xff1a; 1.该如何查找函数&#xff0c;或者数据类型的头文件&#xff1f; 方法&#xff1a; 1.使用vim搭配ctags 2.使用vscode 使用vscode查看头文件位置的步骤&#xff1a; 1.例如下图&#xff0c;我想添加包含file_operations的头文件 2.双击选中数据类型&#xf…