java 20 Stream流

一.Stream

1.所在包

import java.util.stream.*;

2.中间方法与终端方法

//中间方法返回的stream类型 可以连续调用

//终端方法--》返回类型肯定不是Steam  【long void Optional int ....

//中间方法必须以终端方法收尾才能执行

//否则中间方法不执行

//终端方法后面肯定没有方法吗? XXXX的

//filter((T x)->{return boolean });  断言型接口

 

3.特点

内部迭代 惰性求值 函数编程

4.Filter  断言型编程

符合条件的进入stream流 中间方法

5.Limit(long maxSize) 保留maxSize个元素 中间方法

Stream<T> filter(Predicate<? super T> predicate)
返回由与此给定谓词匹配的此流的元素组成的流。
     ArrayList<Student> list = new ArrayList<>();Student s1 = new Student("Lee",21,77);Student s2 = new Student("Andy",25,76);Student s3 = new Student("Joker",20,58);Student s4 = new Student("Andy",25,76);Collections.addAll(list,s1,s2,s3,s4);// 打印两位大于60分的学生//过滤 filter出 元素//截断 保留元素//打印/*list.stream().filter((stu)->{return stu.getScore()>60;}).limit(2).forEach((stu)->{System.out.println(stu);});*///简化list.stream()// 泛型Student 返回Stream.filter(stu->stu.getScore()>60)// 泛型Student 返回Stream.limit(4)// 泛型Student 返回Stream//如果使用方法引用的话需要方法覆盖Student的toString//void accept (T x)//void println 一个.forEach(System.out::println);

6.Stream<T> distinct() 中间方法

如果是用在引用数据类型中要重写 hashCode equals方法

去重用的 底层是 hashCode == equals

	ArrayList<Student> list = new ArrayList<>();Student s1 = new Student("Lee",21,77);Student s2 = new Student("Andy",25,76);Student s3 = new Student("Joker",20,58);Student s4 = new Student("Andy",25,76);Collections.addAll(list,s1,s2,s3,s4);//去重list.stream().distinct()//底层不是equals  底层是hashCode == euqals.forEach(System.out::println);

7.<R> Stream<R> map(Function<? super T,? extends R> mapper)  apply应用

四大接口之一的Function

抽象方法 R apply(T)对元素中每一个进行类型转换  将T类型->R类【基本数据类型是包装类】

//打印不及格的成绩
list.stream()//getScore.map((stu)->{return stu.getScore();})//将Student类型---》Integer类型
.filter((score)->{return score<60;})//过滤出不及格的成绩Student对象们 stream返回类型.forEach((x)->{System.out.println(x);});
//简化
list.stream()//调用stram流
// Integer apply (Student)
//Integer getScore()  符合 类::实例方法
//  Student::getScore()  类::实例方法//下面可改成方法引用.map(stu->stu.getScore())   //.map(Student::getScore)//将Student对象转为Integer对象.filter(score->score<60)//过滤Integer对象中不及格的元素.forEach(System.out::println);//打印出不及格的元素分数

面试题:【两个重点的东西】

Stream中filter和map的区别?

Filter((x)->{return boolean;});  个数

流元素的个数可能改变 但是元素的类型肯定不变

Map((x)->{return R}); 映射类型

流中的元素个数肯定不变 但是元素的类型可能改变

 8.Stream中的Stream<> sorted  中间方法 可以对集合的元素进行排序

		ArrayList<Integer>list_1=new ArrayList<>();Collections.addAll(list_1,100,25,65,18,78);//Stream中的Stream<> sorted  中间方法 可以对集合的元素进行排序list_1.stream().sorted()//按照类的自定义自然顺序进行排序for则会.ClassCastException.forEach(System.out::println);

9. Stream 中Stream<T> sorted(Comparator<? super T> comparator)

		list_1.stream().sorted((x,y)->{return y-x;})//有参的soretd.forEach(System.out::println);

练习 sorted()和 sorted(ComapreTor)

		ArrayList<Student> list = new ArrayList<>();Student s1 = new Student("Lee",21,77);Student s2 = new Student("Andy",25,76);Student s3 = new Student("Joker",20,58);Student s4 = new Student("Andy",25,76);Collections.addAll(list,s1,s2,s3,s4);//降序打印分数list.stream().map((stu)->{return stu.getScore();}).sorted((x,y)->{return y-x;})//比较器--->lambda表达.forEach(System.out::println);//升序打印分数list.stream().map((stu)->{return stu.getScore();})//将student-》Integer类型.sorted()//默认类型的compareTo .forEach(System.out::println);

//按照名字升序 需要在Student类进行compareTo的重写

		//按照姓名升序打印list.stream()//两个参数 int compare X Y//一个参数  int compareTo x//.sorted((n,old)-> n.getName().compareTo(old.getName()))//.sorted((n,old)->{return n.getName().compareTo(old.getName());})//简化 后 类::实例方法.sorted(Student::compareTo).forEach((stu)->{System.out.println(stu.getName());});
Student类:Comparable<Student>@Overridepublic int compareTo(Student s1){return this.name.compareTo(s1.name);}

FlatMap  不是很重要 不需要掌握下面这两个

generate(()->{return xxx;}) 与 limit一起

Iterate(初始值,(x)->{x+1})与 limit一起

Stream.generate().limit(个数).forEach()  产生无数个相同的内容,结合limit 来使用

Stream.iterate(0 初始值,(x)->x+1).limit().forEach()  打印0 1 2 3 ....  产生无数个不同的内容

返回类型boolean 的 三个

.allMatch(x->return boolean )是否全部匹配

.anyMatch()是否至少有一个匹配

.noneMatch()是否都不匹配

ArrayList<Student> list = new ArrayList<>();Student s1 = new Student("Aee",21,77);Student s2 = new Student("Andy",25,76);Student s3 = new Student("Aoker",20,58);Student s4 = new Student("Andy",25,76);Collections.addAll(list,s1,s2,s3,s4);//是不是所有同学以A开头boolean flag=list.stream().allMatch((stu)->{return stu.getName().charAt(0)=='A';});//是否有未成年boolean flag_1=list.stream().anyMatch((stu)->{return stu.getAge()<18;});System.out.println("是不是所有同学以A开头"+flag);System.out.println("是否有未成年"+flag_1);

返回类型是Optional<XXX>

findFirst

Optional<T> findFirst()

返回描述此流的第一个元素的Optional如果流为空,则返回一个空的Optional 。 如果流没有遇到顺序,则可能会返回任何元素

 

		//得到全班最大的年龄Integer age=list.stream().sorted((n,old)->{return old.getAge()-n.getAge();}).map((stu)->{return stu.getAge();})//(被转化的类型)->{ 转化以后的类型}.findFirst()//放  ofNullable.orElse(0);//取System.out.println(age);//打印第一个A开头的String mingzi=list.stream().map((stu)->{return stu.gametName();})//Student--->String 类型了.filter((name)->{return ne.startsWith("A");})//String-->过滤名字为A开头的.findFirst()//找到第一个A开头的  如果能找到则就是那个 找不到就为Optional.empty.orElse("null");//为空则 null 不为空则没事System.out.println(mingzi);

.max(比较器) 返回最后一个元素 Optional【升序默认】

.min(比较器) 返回第一一个元素 Optional【升序默认】

		//得到全班最大的年龄  maxInteger age=list.stream().map((stu)->{return stu.getAge();}).max((n,o)->{return n-o;}).orElse(0);System.out.println("最大的年龄"+age);//得到名字最长的学生Student maxStu=list.stream().max((n,o)->{return n.getName().length()-o.getName().length();}).orElseGet(Student::new);
//.orElse(new Student());System.out.println("最长的学生"+maxStu);

.reduce()//合并  求总分 Optional类型

		//求全班总分Integer ss=list.stream().map((stu)->{return stu.getScore();}).reduce((sum,y)->{System.out.println("sum="+sum+" y="+y);return sum+y;}).orElse(0);System.out.println("总分:"+ss);

.count() long类型的 统计流中的个数 统计上一步的

long count()

返回此流中的元素数

long count()
返回此流中的元素数//求全班总分Integer ss=list.stream().map((stu)->{return stu.getScore();}).reduce((sum,y)->{System.out.println("sum="+sum+" y="+y);return sum+y;}).orElse(0);System.out.println("总分:"+ss);//统计低于平均分int avg=ss/list.size();long number=list.stream().map(Student::getScore).filter((score)->{return score<avg;}).count();System.out.println("低于平均分个数:"+number);

Collect(Collector)收集器

collect(Collectors.toList())

		//将所有及格的学生收集到list中//collect(Collectors.toList())List<Student> list01=list.stream().filter((stu)->{return stu.getScore()>=60;}).collect(Collectors.toList());System.out.println(list01);

collect(Collectors.toSet()) 去重

		//将所有不及格的成绩收集到Set【quchong]//collect(Collectors.toSet())Set<Integer> set=list.stream().filter((stu)->{return stu.getScore()>=60;}).map((stu)->{return stu.getScore();}).collect(Collectors.toSet());System.out.println(set);

ToMap  两个参数 值一样会异常 和 三个参数

.collect(Collectors.toMap(()->{}.()->{},()->{}))Map<String,Integer> map=list.stream().collect(Collectors.toMap((stu)->{return stu.getName();},(stu)->{return stu.getScore();},(oldV,newV)->{return newV;}));System.out.println(map);

collect 分组的  20-【jakc.okrd】 25-【Aron.andy】

//Map<T ,List<R>> map=list.stream().collect(()->{});

	Map<Integer,List<Student>> map01=list.stream().collect(Collectors.groupingBy(Student::getAge));System.out.println(map01);

)

collect.joining()

//必须前一个是String类型

String ss=list.stream().map(Student::getName).collect(Collectors.joining(“@”));

Lee@Andy@Joker  

这样拼起来 

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

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

相关文章

leetcode 2710 移除字符串中的尾随零

1.题目要求: 2.题目代码: class Solution { public:string removeTrailingZeros(string num) {while(num[num.size() - 1] 0){num.pop_back();}return num;} };

AI问答:Google Authenticator(谷歌动态口令) / 设置及操作过程记录

Google Authenticator&#xff0c;即谷歌身份验证器&#xff0c;是谷歌推出的一款基于时间的一次性密码&#xff08;Time-based One-time Password&#xff0c;简称TOTP&#xff09;验证工具。以下是关于Google Authenticator验证的详细解释。 一、工作原理 Google Authentic…

基于STM32的工厂短距离安防巡逻机器人设计:ZIgBee、OpenCV、人工智能(AI)算法(代码示例)

一、项目概述 随着工业化的迅速发展&#xff0c;工厂的安全管理显得尤为重要。为了提高工厂的安全性&#xff0c;我们设计了一款基于STM32的安防巡逻机器人。该机器人能够在工厂内部自主巡逻&#xff0c;实时监控环境&#xff0c;并通过多种传感器和智能算法进行异常检测和处理…

【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型

一、介绍 车辆车型识别&#xff0c;使用Python作为主要编程语言&#xff0c;通过收集多种车辆车型图像数据集&#xff0c;然后基于TensorFlow搭建卷积网络算法模型&#xff0c;并对数据集进行训练&#xff0c;最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操…

Windows基础之病毒编写

声明&#xff1a;学习视频来自b站up主 泷羽sec&#xff0c;如涉及侵权马上删除文章 声明&#xff1a;本文主要用作技术分享&#xff0c;所有内容仅供参考。任何使用或依赖于本文信息所造成的法律后果均与本人无关。请读者自行判断风险&#xff0c;并遵循相关法律法规。 感谢泷…

基于SSM+小程序的宿舍管理系统(宿舍1)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 本宿舍管理系统小程序有管理员和学生两个角色。 1、管理员功能有个人中心&#xff0c;公告信息管理&#xff0c;班级管理&#xff0c;学生管理&#xff0c;宿舍信息管理&#xff0c;宿舍…

时间序列预测(十七)——滑动窗口的使用

这里只是对滑动窗口在时间序列预测中使用做一个分析总结&#xff0c;关于滑动窗口的详细介绍可以参考其他博文。 滑动窗口是一种常用的技术&#xff0c;它通过使用固定大小的窗口来创建训练样本&#xff0c;以便捕捉时间序列中的模式。适用于多种时间序列模型&#xff0c;包括…

git远程和本地创建分支并关联

1.github创建dev分支 点击branches&#xff1a; 创建一个新分支&#xff0c;可以命名为dev 在vscode创建新分支dev 如果远程dev分支在这没有表现出来 在终端执行&#xff1a;git fetch --all 然后手动切换&#xff08;签出/checkout)到dev分支&#xff0c;使用如下命令让…

病床呼叫器设计仿真与实物制作

某医院有编号为1~9号的9个病房&#xff0c;现利用数字电路&#xff0c;设计并制作病房呼叫系统&#xff0c;要求系统功能如下&#xff1a; &#xff08;1&#xff09;病房 ①呼叫功能&#xff1a;每个病房都装有1个呼叫按钮&#xff0c;在病人需要时&#xff0c;可以通过呼叫…

基于Linux中Qt开发的广告机

一、实训目的 1. 掌握Qt开发环境&#xff1a;通过学习和实践&#xff0c;学习如何搭建Qt开发环境&#xff0c;熟悉Qt的基本使用方法&#xff0c;掌握Qt的应用技术&#xff1b; 2. 界面设计与框架&#xff1a;了解Qt的界面布局、整体设计思路以及框架解析&#xff0c;学会构建一…

设计一个灵活的RPC架构

RPC架构 RPC本质上就是一个远程调用&#xff0c;需要通过网络来传输数据。传输协议可以有多种选择&#xff0c;但考虑到可靠性&#xff0c;一般默认采用TCP协议。为了屏蔽网络传输的复杂性&#xff0c;需要封装一个单独的数据传输模块用来收发二进制数据&#xff0c;这个单独模…

Leetcode 64. 最小路径和 动态规划+空间优化

原题链接&#xff1a;Leetcode 64. 最小路径和 二维数据 class Solution { public:int minPathSum(vector<vector<int>>& grid) {int m grid.size();int n grid[0].size();int dp[m][n];dp[0][0] grid[0][0];for (int j 1; j < n; j)dp[0][j] dp[0][…

qt QMenu详解

1、概述 QMenu是Qt框架中的一个类&#xff0c;用于创建和管理菜单。它提供了丰富的接口来添加菜单项&#xff08;通常是QAction对象&#xff09;、子菜单以及分隔符。QMenu可以嵌入到菜单栏&#xff08;QMenuBar&#xff09;中&#xff0c;也可以作为弹出菜单&#xff08;通过…

Android——Activity生命周期

Activity生命周期 onCreate&#xff1a;创建活动。把页面布局加载进内存&#xff0c;君如了初始状态。onStart&#xff1a;开始活动。把活动页面显示在屏幕上&#xff0c;进入了就绪状态。onResume&#xff1a;恢复活动。活动页面进入活跃状态&#xff0c;能够与用户正常交互&…

02- 模块化编程-004 DB18B20温度数码显示

1、DB18B20采样与显示电路 2、DB18B20简介 DS18B20是一款高精度的单总线数字温度传感器&#xff0c;适用于多种温度测量场合。 温度范围&#xff1a;-55℃至125℃精度&#xff1a;可编程设定9至12位分辨率&#xff0c;对应温度分辨率0.5℃、0.25℃、0.125℃、0.0625℃通信&am…

[241102] Fedora Linux 41 正式发布 | Wasmer 5.0 发布

目录 Fedora Linux 41 正式发布Wasmer 5.0 发布 Fedora Linux 41 正式发布 主要更新&#xff1a; DNF 5: 更快、更小、依赖更少&#xff0c;统一了容器、服务器、桌面和设备的包管理体验。桌面更新&#xff1a; Fedora Workstation 41 基于 GNOME 47&#xff0c;默认终端改为…

C++继承

文章目录 一、继承的概念和定义1、继承的概念2、继承的定义3、继承基类成员访问方式的变化 二、基类和派生类之间的转换三、继承中的作用域1、隐藏规则 四、派生类的默认成员函数1、常见默认成员函数2、实现一个不能被继承的类 五、继承与友元六、继承与静态成员变量七、多继承…

嵌入式linux系统中串口驱动框架分析

大家好,今天主要给大家分享一下,如何使用linux系统中的串口实现。 第一:串口基本简介 串口是很常见的一个外设,在Linux下通常通过串口和其他设备或传感器进行通信。根据电平的不同,串口可以分为TTL和RS232。不管是什么样的电平接口,驱动程序是一样的。 第二:Linux下UAR…

秋日盛景,北京马拉松万人齐跑,秀域人工智能理疗获好评无数

在金秋送爽的北京&#xff0c;一场全民瞩目的体育盛事——北京马拉松顺利开跑&#xff0c;再次点燃了这座城市的运动激情。各地跑者齐聚双奥之城&#xff0c;共同奔赴在秋日美景之中。      回首往昔&#xff0c;1981年9月27日&#xff0c;首届北京马拉松赛的举办&#xff…

Java-I/O框架09:InputStreamReader、OutputStreamWriter使用

视频链接&#xff1a;16.24 转换流的使用_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Tz4y1X7H7?spm_id_from333.788.videopod.episodes&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5&p24 1.InputStreamReader使用 package com.yundait.Demo05;import java…