相信我,使用Stream真的可以让代码更优雅
前言
虽然stream在Java8中就已经被引入,但是大多数人却没有去使用这个十分有用的特性,本文就通过介绍几个通过使用stream让代码更简洁、可读,来让你了解stream的方便之处。技巧数组转集合
相信经常刷LeetCode的小伙伴,偶尔会遇到需要将List与基本类型数组进行互转的情况,然后就需要写像下面这样的代码:将List元素存储到数组中ListIntegerlistnewArrayList(Arrays。asList(1,2,3,4,5));int〔〕arrnewint〔list。size()〕;Integer〔〕templist。toArray(newInteger〔0〕);for(inti0;itemp。length;i){arr〔i〕temp〔i〕;}将数组元素存储到List中int〔〕arr{1,2,3,4,5};ListIntegerlistnewArrayList();for(intval:arr){list。add(val);}
以上两个转换虽然写着还不算麻烦,但是每次都需要写一个循环,尤其在数组转List的时候还需要使用一个临时数组,都会让人看着很不舒服,但是如果使用了stream就会大不一样,用stream实现了相同功能的代码如下:将List元素存储到数组中ListIntegerlistnewArrayList(Arrays。asList(1,2,3,4,5));int〔〕arrlist。stream()。mapToInt(Integer::intValue)。toArray();将数组元素存储到List中int〔〕arr{1,2,3,4,5};ListIntegerlistIntStream。of(arr)。boxed()。collect(Collectors。toList());
可以发现通过使用stream,我们能够在写代码的时候更加连贯,代码也更加可靠易维护,注意力也可以放在业务功能上,相信各位就算对lambda语法并不是太熟悉,在阅读上面代码的时候,也很容易能够看懂。统计数组元素中的个数
假设我们现在需要统计并输出一个有重复元素的数组中每个元素及对应元素出现的个数,相信各位都能够想到,我们使用一个Map就很容易解决这个问题,代码如下:String〔〕arr{a,c,a,b,d,c};MapString,IntegermapnewHashMap();for(Strings: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};MapString,IntegermapnewHashMap();for(Strings: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(kk,k1,Integer::sum))。forEach((k,v)System。out。println(k:v));注意
在上面的代码中,Collectors。toMap(kk,k1,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〔〕tempnewInteger〔arr。length〕;for(inti0;iarr。length;i){temp〔i〕arr〔i〕;}Arrays。sort(temp,Comparator。reverseOrder());for(inti0;itemp。length;i){arr〔i〕temp〔i〕;}将数组转为集合类型再进行自定义排序ListIntegerlistnewArrayList();for(intval:arr){list。add(val);}list。sort(Collections。reverseOrder());for(inti0;ilist。size();i){arr〔i〕list。get(i);}通过手写排序算法修改比较规则实现为了让代码更加简洁,使用了最暴力且没有优化的冒泡排序int〔〕arr{1,5,9,7,2,3,7,1,0,3};for(inti0;iarr。length;i){for(intj0;jarr。lengthi1;j){if(arr〔j〕arr〔j1〕){inttemparr〔j〕;arr〔j〕arr〔j1〕;arr〔j1〕temp;}}}
可以发现以上几种方法,我们都需要写很多代码,无法将注意力集中在设计自定义排序这个问题上,但是通过使用stream,我们就可以写出下面这样简洁的代码(如果愿意的话,你也可以把一系列的链式操作写在一行上,但为了代码的可读性,不建议那么做):int〔〕arr{1,5,9,7,2,3,7,1,0,3};arrIntStream。of(arr)。boxed()。sorted(Comparator。reverseOrder())。mapToInt(Integer::intValue)。toArray();注意
在这里其实为了实现数组的逆序,我们只需要调用Arrays的sort方法,然后再进行数组元素的反转即可,不过因为是为了讲解自定义排序,大多数情况下不会是数组逆序这么简单,所以我就写了更加通用一些的代码。统计数组中前k个个高频元素
在最后,我们通过一道题来进行实战以便更好地体验stream的强大之处,当然我们在练习该题的时候,更需要从算法的角度去考虑该题的解法,不过在本文,我们主要为了讲解stream的使用,所以就不去考虑算法的东西了,而如果使用stream,我们就可以写出下面这样简单易懂的代码:classSolution{publicint〔〕topKFrequent(int〔〕nums,intk){returnArrays。stream(nums)。boxed()。collect(Collectors。toMap(ee,e1,Integer::sum))。entrySet()。stream()。sorted((m1,m2)m2。getValue()m1。getValue())。limit(k)。mapToInt(Map。Entry::getKey)。toArray();}}总结
本文介绍了几个简单、实用的stream使用技巧,当然stream的应用远不止此,希望通过本文,能够激发起你学习stream的兴趣,本文若有错误之处,也欢迎你的指正。
来源:blog。csdn。netqq41698074articledetails108502976
春天的云春天的云多姿多彩,有时一天中会有多种不同的变化。早晨,云朵白白的,天空蓝蓝的。云朵像蓝天上镶的白玉,蓝天像云朵盖的被子。云朵有很多的形状。有的软绵绵的,像一棵棵香甜可口的……
关于去芳洲公园玩作文800字今天下午3点前,我和沈奕锟约好去芳洲公园玩,不过我们要先完成好妈妈布置的作业,去芳洲公园玩作文800字。我就开始写作业,默写了全部的词语,还读了英语,还练习了钢琴。我对妈……
奉献名言积极奉献的名言(六)1、鞠躬尽瘁,死而后已。诸葛亮2、一个人应当一次只想一件东西,并持之以恒,这样便有希望得到它。但是我却什么都想,结果是什么也抓不着。每次我都发现,当一个所追求的东西唾手可……
小学优秀日记范例100字XX年11月14日星期日天气:晴今天我和哥哥一起给小狗们洗了一次澡,这时水已经热了,我们把小狗放到盆里,它们有些不情愿。我把它们放在里,他们的毛在水里非常洁白,用水轻轻地……
支付宝和微信都绑定了银行卡,发生手机丢失怎么办?3步给你搞定如果你的支付宝和微信都绑定了银行卡,在手机发生丢失时,该怎么办,谨记这三步操作可减少损失。我们知道现在使用手机进行消费的已经成为了我们的主要消费方式,出门不需要携带现金,……
聆听雨声雨,最令人陶醉的就是那小雨淅淅。雨,总能使人联想到那挪威的森林,法国的乡间小路,以及那美丽的江南水乡。对于雨的记忆于我是很早的,夜间外面下着淅淅小的雨,我蜷在被子里享受着……
巨额纳税的阿里巴巴释放出什么信号?【蓝科技】水木随着阿里巴巴年上缴利税516亿,一举成为互联网企业第一纳税大户,构成企业价值体系中的社会责任被推向新的高潮,也标志着企业间正在开始式形成一项不弱于经济指标的……
主题分享华为P30系列最新主题,附下载链接本文来自花粉俱乐部论坛小白是大神主题信息主题名称:优化版P30P30Pro官方主题JadeFairyland金玉瑶池主题版本:9。0。1主题作者:EMUI小白……
纯洁的使者雪小学作文雪,如梦如幻,如丝如缕,漫天的飞雪,却又壮观雄伟。整一个大地就好像变成了粉装玉砌的世界。它又是纯洁的使者,替整个世界洗去污秽、肮脏与虚假。雪,不停地下着,飞舞的雪花仿佛告……
老外发明飞鸟无人机,没有螺旋桨,飞行跟真鸟毫无差别今天要跟大家好好的介绍一个就算是没有浆也能够飞行的无人机。无人机主要是利用一个遥控以及内部的程序来进行控制,从而使它成为了一个不能载人的空中飞机,它也能利用计算机来进行自动控制……
美丽的冬天作文范文4篇冬天的雪花是美丽的,那雪一下就是一整天,每一片都差不多跟鹅毛般大小,下面是小编为大家整理的美丽的冬天作文范文,仅供参考,欢迎大家阅读。美丽的冬天作文范文(一)冬姑娘送走了……
超线程多核多处理器区别1超线程技术每个单位时间内,CPU只能处理一个线程(Thread)。除非有两个核心处理单元,否则要想在单位时间内处理超过一个的线程是不可能的。超线程HT(Hyper……