最新要闻
- 【聚看点】开锁公司上门多少钱海沧(开锁公司上门多少钱)
- 全球关注:俄罗斯新车销量暴跌 价格却狂涨:丰田凯美瑞卖到130万
- 杭州将拥有13座高铁站 但离中国第一还差得远
- 中国首个国际化影视级VP虚拟制片影棚落地上海 全套好莱坞技术_资讯
- 桌面版RTX 4070与移动版RTX 4080对比实测!谁更强一目了然|环球即时
- 孙子用爷爷苹果手机充7万手游退款遭拒:几个月就把钱弄没了 焦点播报
- tua什么梗_tui 是什么梗简介介绍 世界视点
- 全行业投入力度最大!京东618大促5月23日预售:百亿补贴买贵双倍赔
- 亏电不再是条虫!理想L系车型迎大版本更新:高性能模式将上线
- 天天新资讯:iPhone真的很富士:原相机+自带修图 即得免费富士联名
- 当前报道:菜场大妈战术性剁排骨 1斤瞬间变2斤:画面让网友们无语了
- 《塞尔达传说:王国之泪》M站跌至95分!三家媒体给出中评
- 周一新股提示:美芯晟(688458)上市|全球观察
- 【天天热闻】对话长城汽车总经理:投入近百亿的长城Hi4技术 十年内无对手
- 狂吃“内存”!微信为何越用越大?看到最后我淡定了_焦点速读
- 世界球精选!加拿大失控撞轮渡案调查结果出炉 特斯拉没有机械故障
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
Stream流体系
【资料图】
视频地址https://www.bilibili.com/video/BV1Cv411372m?
1 Stream流概述
目的:简化集合和数组操作的API,结合了Lambda表达式。
Stream流式思想的核心:
- 先得到集合或者数组的Stream流(就是一根传送带)
- 把元素放上去
- 用这个Stream流简化的API来方便的操作元素
2 Stream流获取
- Stream流的三类方法:
- 获取Stream流
- 创建一条流水线,并把数据放到流水线上准备进行操作。
- 中间方法
- 流水线上的操作。一次操作完毕之后,还可以继续进行其他操作。
- 终结方法
- 一个Stream流只能有一个终结方法,是流水线上的最后一个操作。
- Stream操作集合或者数组的第一步是先得到Stream流,然后才能使用流的功能。
- 集合获取Stream流的方式使用Collection接口中的默认方法stream()生成流
/***Collection集合获取流********/Collection list = new ArrayList<>();Stream s = list.stream();/*** Map集合获取流*/Map maps = new HashMap<>();//键流Stream keyStream = maps.keySet().stream();// 值流Stream valueStream = maps.values().stream();//键值对流(拿整体)Stream> keyAndValueStream = maps.entrySet().stream();
- 数组获取Stream流的方式
/**数组获取流****/String[] names = {"张三","李四","王五","范二"};Stream nameStream = Arrays.stream(names);Stream nameStream2 = Stream.of(names);
3 Stream流的常用API
3-1 中间操作方法
注意:
- 中间方法也称为非终结方法,调用完成后返回的新的Stream流可以继续使用,支持链式编程。
- 在Stream流中无法直接修改集合、数组中的数据。
示例
- 过滤:查找出以"张"开头的人的名字
list.stream().filter(s->s.startsWith("张")).forEach(s-> System.out.println(s));
- 统计字符串长度为3的蒜素个数
long size = list.stream().filter(s -> s.length() == 3).count();
- limit获取前几个元素
forEach(s -> System.out.println(s)当s和sout内的s是相同元素时,可以简写成System.out::printlnfilter代表开始过滤,->代表开始过滤,
list.stream().filter(s -> s.startsWith("张")).limit(2).forEach(s -> System.out.println(s));list.stream().filter(s -> s.startsWith("张")).limit(2).forEach(System.out::println);
- skip跳过前几个元素
list.stream().filter(s -> s.startsWith("张")).skip(2).forEach(System.out::println);
- Map:加工方法 :第一个方法为原材料,第二个参数是加工后的结果
- 给集合元素前面都加上一个前缀xxx
list.stream().map(s -> "xxxx"+s).forEach(System.out::println);
- 把所有名字都加工成一个学生对象
2为1的简写1、list.stream().map(s -> new Student(s)).forEach(System.out::println);2、list.stream().map(Student::new).forEach(System.out::println);
- 合并流
//public static Stream concat(Stream extends T> a, Stream extends T> b)//两个不同流合并,例如流1是String类型,流2是Integer类型,此时合并后的流需要是流1和流2的父类,即父类可以接收子类Stream s1 = list.stream().filter(s -> s.startsWith("张"));Stream s2 = Stream.of("Java1","Java2");Stream s3 = Stream.concat(s1,s2);s3.distinct().forEach(System.out::println);
3-2 终结操作方法
注意:终结操作方法,调用完成后流就无法继续使用了,原因是不会返回Stream了。
4 Stream流的综合应用
- 新建一个类存储员工信息
import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;@Data@NoArgsConstructor@AllArgsConstructorpublic class Employee { private String name; private char sex; private double salary; private double bonus; private String punish; //处罚信息}
- 定义两个集合,并向集合中添加元素
List one = new ArrayList<>();one.add(new Employee("猪八戒","男",30000,25000,null));one.add(new Employee("孙悟空","男",25000,1000,"迟到"));one.add(new Employee("沙僧","男",2000,20000,null));one.add(new Employee("小白龙","男",20000,25000,null));List two = new ArrayList<>();two.add(new Employee("武松","男",15000,9000,null));two.add(new Employee("李逵","男",25000,10000,null));two.add(new Employee("西门庆","男",50000,10000,"迟到"));two.add(new Employee("潘金莲","女",3500,1000,"打人"));two.add(new Employee("武大郎","女",20000,0,"偷窃"));
- 筛选两个部门的最高工资的员工信息。新建一个对象Topperformer
import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;@Data@AllArgsConstructor@NoArgsConstructorpublic class Topperformer { private String name; private double money;//月薪}
// 1、开发1部的最高工资的员工//指定大小规则Topperformer t = one.stream().max((e1, e2) -> Double.compare(e1.getSalary() + e1.getBonus(), e2.getSalary() + e2.getBonus())).map(e -> new Topperformer(e.getName(), e.getSalary() + e.getBonus())).get();
// 2、开发2部的最高工资信息// 1)先用max定义规则,比较大小;2)用map进行加工Topperformer t2 = two.stream().max((e1, e2) -> Double.compare(e1.getSalary() + e1.getBonus(), e2.getSalary() + e2.getBonus())).map(e -> new Topperformer(e.getName(), e.getSalary() + e.getBonus())).get();
- 统计2个部门的平均月收入,去掉最高工资和最低工资。
//开发1部one.stream().sorted((e1, e2) -> Double.compare(e1.getSalary() + e1.getBonus(), e2.getSalary() + e2.getBonus())).skip(1).limit(one.size()-2).forEach(e->{//求出总和:剩余员工的工资总和allMoney += e.getBonus()+e.getSalary();});System.out.println("开发1部的平均工资是" +allMoney/(one.size()-2));//开发2部two.stream().sorted((e1,e2)->Double.compare(e1.getSalary()+e1.getBonus(),e2.getSalary()+e2.getBonus())).skip(1).limit(two.size()-2).forEach(employee -> {allMoney2 += employee.getSalary()+employee.getBonus();});System.out.println("开发2的平均月收入是"+allMoney2);
- 统计两个部门的整体平均工资
Stream s1 = one.stream();Stream s2 = two.stream();Stream s3 = Stream.concat(s1, s2);s3.sorted((e1, e2) -> Double.compare(e1.getSalary() + e1.getBonus(), e2.getSalary() + e2.getBonus())).skip(1).limit(one.size()+two.size()-2).forEach(e ->{allMoney3 += e.getSalary()+e.getBonus();});BigDecimal a = BigDecimal.valueOf(allMoney3);BigDecimal b = BigDecimal.valueOf(one.size()+ two.size()-2);System.out.println("2个部门的整体平均工资是" +a.divide(b,2, RoundingMode.HALF_UP));
整体代码:
package stream_test;import java.math.BigDecimal;import java.math.RoundingMode;import java.util.ArrayList;import java.util.List;import java.util.stream.Stream;public class StreamDemo1 { public static double allMoney; public static double allMoney2; public static double allMoney3; public static void main(String[] args) { List one = new ArrayList<>(); one.add(new Employee("猪八戒","男",30000,25000,null)); one.add(new Employee("孙悟空","男",25000,1000,"迟到")); one.add(new Employee("沙僧","男",2000,20000,null)); one.add(new Employee("小白龙","男",20000,25000,null)); List two = new ArrayList<>(); two.add(new Employee("武松","男",15000,9000,null)); two.add(new Employee("李逵","男",25000,10000,null)); two.add(new Employee("西门庆","男",50000,10000,"迟到")); two.add(new Employee("潘金莲","女",3500,1000,"打人")); two.add(new Employee("武大郎","女",20000,0,"偷窃")); // 1、开发1部的最高工资的员工 //指定大小规则// Employee employee = one.stream().max((e1, e2) -> Double.compare(e1.getSalary() + e1.getBonus(), e2.getSalary() + e2.getBonus()))// .get(); Topperformer t = one.stream().max((e1, e2) -> Double.compare(e1.getSalary() + e1.getBonus(), e2.getSalary() + e2.getBonus())) .map(e -> new Topperformer(e.getName(), e.getSalary() + e.getBonus())).get(); System.out.println(t); // 3-2、开发2部的最高工资信息 // 1)先用max定义规则,比较大小;2)用map进行加工 Topperformer topperformer = two.stream().max((e1, e2) -> Double.compare(e1.getSalary() + e1.getBonus(), e2.getSalary() + e2.getBonus())) .map(e -> new Topperformer(e.getName(), e.getSalary() + e.getBonus())).get(); System.out.println(topperformer); // 不能在main方法中定义一个局部变量供main方法中的foreach循环使用。 // 因为main方法和foreach属于不同的方法栈,在不同的栈里面跑,互相不能访问。 // 解决办法:共享变量:所有变量都可以访问,属于类 // 2、统计平均工资,去掉最高工资和最低工资 e1在前就是升序,e2在前就是降序 one.stream().sorted((e1, e2) -> Double.compare(e1.getSalary() + e1.getBonus(), e2.getSalary() + e2.getBonus())). skip(1).limit(one.size()-2).forEach(e->{ //求出总和:剩余员工的工资总和 allMoney += e.getBonus()+e.getSalary(); }); System.out.println("开发1部的平均工资是" +allMoney/(one.size()-2)); // 4-2、开发2部的平均月收入,去掉最高和最低工资。 two.stream().sorted((e1,e2)->Double.compare(e1.getSalary()+e1.getBonus(),e2.getSalary()+e2.getBonus())) .skip(1).limit(two.size()-2).forEach(employee -> { allMoney2 += employee.getSalary()+employee.getBonus(); }); System.out.println("开发2的平均月收入是"+allMoney2); // 3、合并2个集合流 Stream s1 = one.stream(); Stream s2 = two.stream(); Stream s3 = Stream.concat(s1, s2); s3.sorted((e1, e2) -> Double.compare(e1.getSalary() + e1.getBonus(), e2.getSalary() + e2.getBonus())) .skip(1).limit(one.size()+two.size()-2).forEach(e ->{ allMoney3 += e.getSalary()+e.getBonus(); }); BigDecimal a = BigDecimal.valueOf(allMoney3); BigDecimal b = BigDecimal.valueOf(one.size()+ two.size()-2); System.out.println("2个部门的整体平均工资是" +a.divide(b,2, RoundingMode.HALF_UP)); }}
5 Stream流的收集操作
- 收集Stream流的含义:把Stream流操作后的结果数据转回到集合或者数组中去。流只能使用一次。
- Stream流:方便操作集合/数组的手段。
- 集合/数组:才是开发中的目的。
- 转换成list集合
Stream s1 = list.stream().filter(s ->s.startsWith("张"));//List list1 = s1.toList(); //得到不可变集合List zhangList = s1.collect(Collectors.toList());
- 转换成set集合
Stream s2 = list.stream().filter(s ->s.startsWith("张"));Set zhangList2 = s2.collect(Collectors.toSet());
- 转换成数组
Stream s3 = list.stream().filter(s -> s.startsWith("张"));// Stream转换成数组时,默认转换成Object形式// Object[] arrs = s3.toArray();// 如果非要把object类型转为String类型String[] arrs = s3.toArray(s->new String[s]);// String[] arrs2 = s3.toArray(String[]::new);System.out.println(arrs); //输出数组的地址System.out.println(Arrays.toString(arrs)); //输出数组的值
关键词:
Stream流体系
美国才是真正的“经济胁迫者”|天天快看
【聚看点】开锁公司上门多少钱海沧(开锁公司上门多少钱)
全球关注:俄罗斯新车销量暴跌 价格却狂涨:丰田凯美瑞卖到130万
杭州将拥有13座高铁站 但离中国第一还差得远
中国首个国际化影视级VP虚拟制片影棚落地上海 全套好莱坞技术_资讯
桌面版RTX 4070与移动版RTX 4080对比实测!谁更强一目了然|环球即时
孙子用爷爷苹果手机充7万手游退款遭拒:几个月就把钱弄没了 焦点播报
AcWing905.区间选点
python调用父类方法的三种方式(super调用和父类名调用)_当前速递
当前快报:06-半加器
tua什么梗_tui 是什么梗简介介绍 世界视点
全行业投入力度最大!京东618大促5月23日预售:百亿补贴买贵双倍赔
亏电不再是条虫!理想L系车型迎大版本更新:高性能模式将上线
天天新资讯:iPhone真的很富士:原相机+自带修图 即得免费富士联名
当前报道:菜场大妈战术性剁排骨 1斤瞬间变2斤:画面让网友们无语了
《塞尔达传说:王国之泪》M站跌至95分!三家媒体给出中评
周一新股提示:美芯晟(688458)上市|全球观察
世界聚焦:VMware虚拟机联网详述
【天天热闻】对话长城汽车总经理:投入近百亿的长城Hi4技术 十年内无对手
狂吃“内存”!微信为何越用越大?看到最后我淡定了_焦点速读
世界球精选!加拿大失控撞轮渡案调查结果出炉 特斯拉没有机械故障
在华销售产品未通过安全审查被叫停采购:美光股价暴跌超6% 天天报资讯
每日视讯:快手上市后首次实现集团整体盈利:Q1净利润4200万元
速讯:中国文化娱乐产业市场发展现状 中国文化娱乐产业投资战略规划研究
记录--九个超级好用的 Javascript 技巧 环球速看料
(笔记)运放电路中并联反馈电容与反馈电阻的工作原理 每日头条
Mybatis基本使用
sed
当前消息!郴州市苏仙区开展2023年农村法治宣传教育月暨民法典宣传月启动仪式活动
环球微速讯:又遇极端天气!桂林2小时下完了1天的大暴雨
资讯:2999元 理想L9、L8官方车顶行李架上新预告:全自研、专车定制
旗舰同款!OPPO Reno10系列搭载动态光影屏:1400nit+120Hz高刷
天天观察:唯一百亿亿次 美国三度蝉联TOP500超算冠军:中国超算不陪着玩了
【全球快播报】强制单踏板“拜拜” 特斯拉新版本软件说明:动能回收可调力度了
今年会出现极端高温吗?专家:预计今夏高温情况比去年弱 每日简讯
细谈使用CodeQL进行反序列化链的挖掘过程
世界观察:react-naive工作原理
债市日报:5月22日
【世界播资讯】水洼煮食物晾衣服生活中还遇到过哪些类似现象?
世界微资讯!安卓跑分要变天了!安兔兔V10公测版正式发布:分数要涨
世界速讯:突破封锁活下来了!华为88个子公司成功实现MetaERP切换:自主可控、全球上线
【报资讯】网易逆水寒手游彩蛋揭秘:日照金山宛如照片 这画质你敢信是手机能跑
搭载原相PAW3395旗舰传感器:雷柏推出VT9S无线鼠标
天天即时:红米平板2曝光:处理器换用骁龙680!主打极致性价比
六年级上册求阴影部分的面积及答案 六年级上册求阴影部分的面积_世界观速讯
分布式任务调度:xxl-job
全球速讯:湖北省荆州市沙市区领导参观考察璞华苏州总部
速读:论elasticsearch在Windows环境的安装
收评:两市窄幅波动沪指涨0.39% 供销社概念股领涨-焦点热议
以军在约旦河西岸打死3名巴勒斯坦人
焦点播报:用上比亚迪刀片电池 新款特斯拉Model Y海外下线:充电超猛
实时:吴刚《后浪》再登热搜:网友吐槽其侮辱中医
AMD Yes还能饭否? RX 7600显卡性能偷跑:差得有点多 要闻速递
神车上新!新款比亚迪宋PLUS DM-i实车现身:装上海豹同款大灯
支付宝App可以换皮肤了!官方教程出炉:免费领
MyBatis-Plus 可视化代码生成器来啦,让你的开发效率大大提速!!
比亚迪选用顶象无感验证,增强售后服务平台安全性
go语言变量定义及类型_焦点快看
【vue流程编辑器框架】Vue-Flowchart-Editor
揭秘百分比图的魅力:数据之美引领决策智慧
退休人员涨工资最新消息2023年 2023养老金上调4.5%是不是真的?
环球热头条丨内蒙古火车站乐手齐奏万马奔腾:旅客拍手叫好
JDG战队FMVP选手knight:生日能拿到冠军特别开心
当前热文:安卓最强性能!vivo X90S下月发布:搭载天玑9200+
今日视点:男子52次跟车式逃停车费2870元 结果惨了
【世界独家】怀柔温馨之家,欢迎你们!
时讯:【Java】引用传递?值传递?
看完这篇,DWS故障修复不再愁-全球热闻
【DSP视频教程】DSP视频教程第12期:TI开源分享IQmath DSP源码,适用于所有Cortex-M内核,本期教程做个手把手移植 (2022-05-22)
最全iOS 上架指南 全球微资讯
焦点滚动:(笔记)运放的带宽、增益带宽积、转换速率、反馈系统等概念理解
直击华尔街|Scott Redler解读华尔街一周:债务上限问题不会导致剧烈动荡 经济若衰退美联储需降息
李楠预测:手机的形态将迎来革命 这下网友有话说了
环球新资讯:清华大学女生获世界小姐选美冠军:谁说学霸就是丑 网友围观真美吗
底层重构 微软Win12最快明年问世:AI魔改搜索体验
使用ssh公钥密钥自动登陆linux服务器 环球快资讯
天天热消息:关于Excel表格中对多个General或者Number数值格式的单元转换为Text文本时-值包含E+的方法处理
世界最新:AI诈骗正在全国爆发!一公司老板10分钟被AI诈骗430万
全球要闻:专治PCIe 5.0发烧 利民SSD散热器到手99.9元(45W强悍散热)
今日关注:国内没人买?东风本田CR-V插混、e:NS1纯电车要卖到海外去了
环球播报:WPS AI再获升级:文档内容、格式规范一键生成
85%肉含量无淀粉 一口爆汁:火山石烤肠19.9元2斤大促
天准科技(688003.SH):机器视觉是一种非常通用的技术
Java使用HttpClient以multipart/form-data向接口上传文件
Seata 的可观测实践
直播源码技术录制功能知识
java 外壳加密,完美解决|全球看点
热文:个人养老金产品代销排行:招行、交行、平安暂居前三,优势还是烦恼?
全球观热点:开机先看电影?壁纸神器Wallpaper Engine惊现《流浪地球2》 网友吐槽缺德
世界即时看!路特斯被曝将试驾车当新车交付 车主:有全部证据 索赔385万
紫气东来!魅族20 PRO推出晨曦紫新配色:4399元起售 享3年质保
苹果神一样存在!iPhone彻底统治日本市场:份额超50% 安卓被摩擦-全球通讯
天天报道:小米Civi 3正面首曝:药丸曲面屏比iPhone 14 Pro更精致
南阳市新野县团结小学经典诵读展示活动成功举办
rt下降40%?程序并行优化六步法|天天最资讯
为什么MySQL单表不能超过2000万行?_环球动态
05-译码器
全球观焦点:消夏之夜购物节吸引百余商家汇聚 到场市民超过10万人次
每日讯息!OPPO Reno10影像称绝:全系标配长焦镜头