最新要闻
- 每日观察!拍了10多年星星!努比亚Z50 Ultra升级11大星空算法
- 今日看点:AI免费设计LOGO效果惊艳 雷军200万花早了
- 1.6L自吸最大功率99kW 2023款日产轩逸本月上市
- 焦点日报:一加Ace 2V首发主动增强式超级Wi-Fi:穿墙能力提升30%
- 全球快报:一加Ace 2V触控体验碾压iPhone 14 Pro Max:在安卓阵营中表现最佳
- 赞美翡翠的优美句子有哪些?
- 【世界速看料】“APP刺客”倒逼厂商升级大内存、大存储!8+128根本不够用了
- 天天微速讯:一人改代码搞崩推特 马斯克气疯:全部重写!
- 天天观察:出演《狂飙》爆红!雷军晒“大嫂”高叶人像照:小米13徕卡镜头
- 每日快播:华昌集团
- 全球聚焦:你几点睡?全国熬夜最狠城市揭晓:广东最牛 干这些行业的熬夜最多
- 金俊秀为什么叫细亚俊秀?金俊秀个人简介资料
- 已考上大学的简短四字祝福语有哪些?祝福前途似锦的古诗词有哪些?
- 强迫性动作属抑郁症吗?强迫性动作的自我疗法有哪些?
- 咬甲癖是心理疾病吗?咬甲癖怎么治疗?
- 皮肤剥离强迫症是什么?皮肤剥离强迫症怎么治疗?
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
【天天时快讯】自从用了 Stream,代码更简洁优雅了!
来源:blog.csdn.net/qq_41698074/article/details/108502976
前言
虽然 stream在 Java8 中就已经被引入,但是大多数人却没有去使用这个十分有用的特性,本文就通过介绍几个通过使用stream让代码更简洁、可读,来让你了解stream的方便之处。
(资料图)
技巧
数组转集合
相信经常刷LeetCode的小伙伴,偶尔会遇到需要将List与基本类型数组进行互转的情况,然后就需要写像下面这样的代码:
// 将 List 元素存储到数组中List list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));int[] arr = new int[list.size()];Integer[] temp = list.toArray(new Integer[0]);for (int i = 0; i < temp.length; i++) { arr[i] = temp[i];}// 将数组元素 存储到 List 中int[] arr = {1, 2, 3, 4, 5};List list = new ArrayList<>();for (int val : arr) { list.add(val);}
以上两个转换虽然写着还不算麻烦,但是每次都需要写一个循环,尤其在数组转List的时候还需要使用一个临时数组,都会让人看着很不舒服,但是如果使用了stream就会大不一样,用stream实现了相同功能的代码如下:
// 将 List 元素存储到数组中List list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));int[] arr = list.stream().mapToInt(Integer::intValue).toArray();// 将数组元素 存储到 List 中int[] arr = {1, 2, 3, 4, 5};List list = IntStream.of(arr).boxed().collect(Collectors.toList());
可以发现通过使用stream,我们能够在写代码的时候更加连贯,代码也更加可靠易维护,注意力也可以放在业务功能上,相信各位就算对lambda语法并不是太熟悉,在阅读上面代码的时候,也很容易能够看懂。
统计数组元素中的个数
假设我们现在需要统计并输出一个有重复元素的数组中每个元素及对应元素出现的个数,相信各位都能够想到,我们使用一个Map就很容易解决这个问题,代码如下:
String[] arr = {"a", "c", "a", "b", "d", "c"};Map map = new HashMap<>();for (String s : arr) { if (map.containsKey(s)) { map.put(s, map.get(s) + 1); } else { map.put(s, 1); }}map.forEach((key, value) -> System.out.println(key + " : " + value));
如果对Map中的API更加熟悉的小伙伴,可能会写出下面这个更加简洁的代码:
String[] arr = {"a", "c", "a", "b", "d", "c"};Map map = new HashMap<>();for (String s : arr) { map.put(s, map.getOrDefault(s, 0) + 1);}map.forEach((key, value) -> System.out.println(key + " : " + value));
但是,如果使用stream,我们还能写出更加简洁的代码,同样不需要写烦人的循环了,而且只需两行代码即可(为了提高可读性,进行了换行):
String[] arr = {"a", "c", "a", "b", "d", "c"};Stream.of(arr) .collect(Collectors.toMap(k -> k, k -> 1, Integer::sum)) .forEach((k, v) -> System.out.println(k + " : " + v));
注意
在上面的代码中,Collectors.toMap(k -> k, k -> 1, Integer::sum)
这一部分可能不好理解,对于这里面的三个参数,第一个参数代表将arr中的每一个元素作为Map中的key,第二个参数代表每一个key所对应的value,在这里每一个元素都对应个数1,第三个参数代表,如果存在相同的key,该如何进行合并,这里通过使用Integer::sum
,代表将具有相同key的元素进行合并时,其value进行相加,这样便实现了每个元素个数的统计。
基本数据类型的数组自定义排序
有时我们会遇到对基本数据类型的数组进行自定义排序的情况,不同于包装类型的数组和集合可以直接使用比较器,我们只能通过将基本数组类型的数组转为包装类型或者存储在集合中,在排序完成后再转为基本类型的数组,再者,我们只能通过手写排序算法,修改排序算法中的比较进行实现。
不管是哪种方法,我们都没办法将精力放在逻辑功能上,必须写一些额外的代码,甚至是修改底层逻辑,就像下面的代码一样(实现数组逆序):
int[] arr = {1, 5, 9, 7, 2, 3, 7, -1, 0, 3};// 将数组转为包装类型再进行自定义排序Integer[] temp = new Integer[arr.length];for (int i = 0; i < arr.length; i++) { temp[i] = arr[i];}Arrays.sort(temp, Comparator.reverseOrder());for (int i = 0; i < temp.length; i++) { arr[i] = temp[i];}// 将数组转为集合类型再进行自定义排序List list = new ArrayList<>();for (int val : arr) { list.add(val);}list.sort(Collections.reverseOrder());for (int i = 0; i < list.size(); i++) { arr[i] = list.get(i);}// 通过手写排序算法修改比较规则实现// 为了让代码更加简洁,使用了最暴力且没有优化的冒泡排序int[] arr = {1, 5, 9, 7, 2, 3, 7, -1, 0, 3};for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr.length - i - 1; j++) { if (arr[j] < arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } }}
可以发现以上几种方法,我们都需要写很多代码,无法将注意力集中在设计自定义排序这个问题上,但是通过使用stream,我们就可以写出下面这样简洁的代码(如果愿意的话,你也可以把一系列的链式操作写在一行上,但为了代码的可读性,不建议那么做):
int[] arr = {1, 5, 9, 7, 2, 3, 7, -1, 0, 3};arr = IntStream.of(arr) .boxed() .sorted(Comparator.reverseOrder()) .mapToInt(Integer::intValue) .toArray();
注意
在这里其实为了实现数组的逆序,我们只需要调用Arrays的sort方法,然后再进行数组元素的反转即可,不过因为是为了讲解自定义排序,大多数情况下不会是数组逆序这么简单,所以我就写了更加通用一些的代码。
统计数组中前 k 个个高频元素
在最后,我们通过一道题来进行实战以便更好的体验stream的强大之处,当然我们在练习该题的时候,更需要从算法的角度去考虑该题的解法,不过在本文,我们主要为了讲解stream的使用,所以就不去考虑算法的东西了,而如果使用stream,我们就可以写出下面这样简单易懂的代码:
class Solution { public int[] topKFrequent(int[] nums, int k) { return Arrays.stream(nums) .boxed() .collect(Collectors.toMap(e -> e, e -> 1, Integer::sum)) .entrySet() .stream() .sorted((m1, m2) -> m2.getValue() - m1.getValue()) .limit(k) .mapToInt(Map.Entry::getKey) .toArray(); }}
总结
本文介绍了几个简单、实用的stream使用技巧,当然stream的应用远不止此,希望通过本文,能够激发起你学习stream的兴趣,本文若有错误之处,也欢迎你的指正。
近期热文推荐:
1.1,000+ 道 Java面试题及答案整理(2022最新版)
2.劲爆!Java 协程要来了。。。
3.Spring Boot 2.x 教程,太全了!
4.别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!
5.《Java开发手册(嵩山版)》最新发布,速速下载!
觉得不错,别忘了随手点赞+转发哦!
关键词:
-
全球聚焦:gitee突然无法访问
gitee突然拉不了代码,报如下错误:Failedtoconnecttogitee comport443:Operationtimedout情况一:仓库域名无法访问1、查询可以
来源: -
【天天时快讯】自从用了 Stream,代码更简洁优雅了!
来源:blog csdn net qq_41698074 article details 108502976前言虽然stream在Java8中就已经被引...
来源: 天天速递!全景剖析阿里云容器网络数据链路(六):ASM Istio
全球聚焦:gitee突然无法访问
【天天时快讯】自从用了 Stream,代码更简洁优雅了!
每日观察!拍了10多年星星!努比亚Z50 Ultra升级11大星空算法
今日看点:AI免费设计LOGO效果惊艳 雷军200万花早了
1.6L自吸最大功率99kW 2023款日产轩逸本月上市
焦点日报:一加Ace 2V首发主动增强式超级Wi-Fi:穿墙能力提升30%
全球快报:一加Ace 2V触控体验碾压iPhone 14 Pro Max:在安卓阵营中表现最佳
全球微动态丨为什么99%的程序员都做不好SQL优化?
当前通讯!跟老杜从零入门MyBatis到架构思维(一)MyBatis概述
告别数据开发中的人工审核!火山引擎 DataLeap 落地“自动校验开发规范”能力
每日播报!Markdown语法学习
赞美翡翠的优美句子有哪些?
【世界速看料】“APP刺客”倒逼厂商升级大内存、大存储!8+128根本不够用了
天天微速讯:一人改代码搞崩推特 马斯克气疯:全部重写!
天天观察:出演《狂飙》爆红!雷军晒“大嫂”高叶人像照:小米13徕卡镜头
全球短讯!若依项目部署详解
最新:python奇葩反爬-你是故意的还是不小心的
全球观焦点:(数据库系统概论|王珊)第十章数据库恢复技术-第四、五、六、七节:数据库恢复技术和数据库镜像
全球百事通!以图搜图实现
每日播报!四步教会你如何画好流程图?
每日快播:华昌集团
全球聚焦:你几点睡?全国熬夜最狠城市揭晓:广东最牛 干这些行业的熬夜最多
金俊秀为什么叫细亚俊秀?金俊秀个人简介资料
已考上大学的简短四字祝福语有哪些?祝福前途似锦的古诗词有哪些?
强迫性动作属抑郁症吗?强迫性动作的自我疗法有哪些?
天天热点评!嫌弃之余,百度的这些搜索技巧真得会!
环球热议:EF7数据库提供者的自定义值生成器
全球热议:Use CMake notes
ArrayList和LinkedList的区别
咬甲癖是心理疾病吗?咬甲癖怎么治疗?
皮肤剥离强迫症是什么?皮肤剥离强迫症怎么治疗?
中移动董事长喊话中小学必学编程:还有委员喊话取消英语主科学了没用 你支持谁?
【世界快播报】最受欢迎的豪华中大型SUV 新款宝马X5实车亮相:国产必卖爆
湖北省“最强9万元补贴”蔓延 云南东风本田抄作业:直补6万
热点在线丨比Dev渠道更“快”!微软为Windows新增Canary测试渠道
全球观热点:砸130亿元 日本又失败!新主力火箭发射后自毁 日本专家谈落后中国多少年
焦点!【ES三周年】Elasticsearch安全配置详解
时讯:【MRTK】修改 HoloLens 应用的默认系统设置
新动态:开心档之Python3 面向对象
面试官要你介绍项目,怎么说?
每日速读!git的使用(一篇非常好的文章)
【快播报】老杜带你从零入门MyBatis,学MyBatis看这篇就够了!
bt种子是什么意思?bt种子怎么变成文件?
怎么查询手机号的号主姓名?怎么查询手机号用了多少年?
cpu怎么看性能参数?cpu检测软件哪个好?
车主称极氪001空调喷白粉末 官方回应:符合国标没有损害
世界今热点:育碧参与 巴黎圣母院加速修复:力争明年重新开放
世界速看:为什么小米手机不在美国卖?看完原因对雷军更有好感
天天快看:魅族20 Pro真机照出炉:“纽扣”四摄有意思
今日聚焦!《卧龙》超猛玩家穿着内裤打Boss 张梁吕布都无奈了
传真机是干什么用的?怎么发传真?
吉吉影音是什么?吉吉影音手机版离线缓存怎么用?
【世界播资讯】封装发送短信功能的封装过程
快报:什么是流程图?一篇文章就帮你搞定了
建立私人知识网站 cpolar轻松做到1 (部署DokuWiki)
热点!cad块属性定义及应用
叶辰是什么电视剧
环球观速讯丨迷惑行为!女司机给奥迪Q3加玻璃水:一股脑全倒进机油壶
天天热门:猪肉含量≥85% 一口全是肉:亚明猪肉烤肠2斤29.9元发车
全球最资讯丨看片、下载神器!四盘位NAS极空间Z4s史低价:2899元
世界即时:阿里影业总裁谈《长空之王》:展现了我们的意志力和信心
焦点!东风系疯狂补贴!雪铁龙、标致、本田大降价:12万能买C级轿车
天天简讯:长沙银行:向不特定对象发行可转债申请获上交所受理
全球百事通!tabby美观且实用的终端工具(windows/macos版 ,亲测有效!!!)
Spring6超全面教程,老杜带你玩转Spring6
更改windows桌面路径的教程
全球速读:亲测可用,ChatGPT 对话技巧
男子临时起意偷井盖 外卖小哥挺身而出上前制止
聚焦:N卡CPU占用率高的bug确认了 NVIDIA表态:即将修复
世界看点:中国著名雷达专家王小谟逝世 享年84岁
每天暴卖7000辆 但比亚迪的“卷杀”还没有要停下来的意思
世界关注:古巴一波音737客机撞鸟 引擎起火客舱浓烟弥漫
今日报丨开心档之Java 9 新特性
中信证券:海外锂价对国内出现明显溢价或对锂价形成支撑
全球快看:没商量余地!日本核污水排海将影响整个生物圈 海产品或都有辐射
《最后生还者》收视率再创新高
四川大学生组团去工地吃饭:13块随便吃 好吃又实惠
天天热文:浅谈基于Web的跨平台桌面应用开发
环球视讯!聊聊消息队列中的基础概念
今日热议:吉利汽车2月销量10.87万辆 极氪同比增长87% 可自主选择是否开启单踏板
全球信息:苹果iPhone掉熊窝被叼走 第一视角记录血盆大口
快报:荣耀赵明:苹果还是行业标杆 向苹果致敬 然后超越
环球快看:人口不断下降!一周工作时间增至69小时 韩国打工人也要迎来996
6g是什么概念
简讯:父母不给买鞋28岁女儿瞬间崩溃 跪地哀求200块都不给我花:网友感叹
天天新资讯:python-模块与包
男子在LV官网买包近2年未发货:最后商家取消订单
【快播报】男子挑战18元5片天价土豆火锅店:最后点了5盘土豆吃到崩溃
今日热讯:小伙早餐喝下20个生鸡蛋 网友:是个狠人 上一个这么喝的是周润发
环球热讯:弹幕也要放广告?!还能不能让人好好看剧了
视讯!避免延期发售?曝《GTA6》可能削减本体内容移到后续DLC
焦点热议:公称抗拉强度值_公称抗拉强度
教你用QQ邮箱如何发送文件
天天速看:南昌工学院开展“保护母亲河,争当河小青”净滩环保志愿活动
天天关注:收到背去世老人下楼订单?顺丰回应引围观 网友感叹这单也敢接
每日速读!拒绝ChatGPT后:苹果光速反悔
观众对《最后生还者》真人剧选角不满:女演员与想象不符
每日速讯:女子入职10天因老板娘不同意被开除:当事人感觉“很离谱”
2-高级特性