保健励志美文体育育儿作文
投稿投诉
作文动态
热点娱乐
育儿情感
教程科技
体育养生
教案探索
美文旅游
财经日志
励志范文
论文时尚
保健游戏
护肤业界

相信我,使用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

表哥初中作文我有一个表哥,这是人尽皆知的事儿。但是他和我合不来,没少儿为了一小事抓破脸皮。关键是我俩性格合不来。我就是一个地地道道的天不怕地不怕,而他,大写的束手束脚过年之后呢,是肯……苹果官网昨夜再度更新iPhone全线大降价,没有iPhone【IT爆料王原创文章】就在昨天晚上,苹果官方网站进入了稍等一下的更新状态,在这一时段内,苹果各个域名均无法访问。笔者脑中灵光一闪而过:可能又要发布新硬件!是iPhoneSE2还……请拿出一段最能体现你水平的代码小伙子这样做,当场被录用程序员面试,免不了会被问编码的问题。如果面试官问你,最能代表你的当下水平的代码是什么?你该怎么回答呢?张工是一名java程序员,最近到一家公司面试,面试官:请拿出一段最能……特斯拉很好骗路上放三枚小贴纸,特斯拉就拐进了反向车道车栗子发自凹非寺量子位报道公众号QbitAI如何欺骗一只特斯拉?只要在地上摆几张小贴纸,像上面的红点这样排成一行。辅助驾驶系统AutoPilot就会以为……小米又发布了一款新机!女孩子可能更喜欢4月1日下午,小米召开了爱信不信见面会,期间一共发布了20多款新品。其中就包括了一款十分可爱的新机,它就是小米9SE布朗熊限量套装版。一款女孩子可能会比较喜欢的手机。这是……小米一口气发布23款新品其中有5款是愚人节特别新品今日下午,小米举办爱信不信直面会,一口气发布了23款新品,其中这5款是是愚人节特别新品,大家发现没?小米9王源限量版小米9王源限量版配置和普通版一样,6。39英寸水……iPadmini5国行上手性价比劲过小米,但这个爆点太可惜在3月份这场苹果连续剧里,iPadmini5的出现,应该算是最激动人心的产品更新之一了。一如既往的外形,几乎不变的配置这份2019年的旧瓶新酒,到底是好喝还是难喝?The……一次有意义的公益活动叙事作文今天早上,天阴沉沉的,我们在老师的带领下,举行了一场清除野广告的公益活动。老师先给我们分工:赵哲贤负责打水、张展硕负责铲广告、方维琛负责刷广告分好工,大家便冲进了楼道里。……苹果又降价了!iPhone最高降500元,14天内可退差价4月1日,因增值税率调整,苹果官方多款产品都进行了降价。目前,苹果中国官网已经同步显示这次降价调整。其中,iPhoneXS与XSMax系列降幅500元,iPhone……毕业生房地产工作实习日记范文房地产是一个综合的较为复杂的概念,从实物现象看,它是由建筑物与土地共同构成。下面为大家分享了毕业生房地产工作实习日记,欢迎借鉴!12月18日今天,提前进入了实习的阶……1。24Kg轻薄办公,华硕灵耀Deluxe13一周体验钛极客华硕灵耀Deluxe13作为一个经常出差的移动办公族,体积和性能往往是我在选购笔记本时最难权衡的两个点,它们就像天平的两边:高性能的办公本甚至游戏本,追求功耗低和缩小散热……中兴通讯还能扛起5G的大旗吗?中兴通讯(000063。SZ),作为A股5G通信设备板块的扛把子,今日又受到了资本市场的极大关注1000多亿的盘子开盘没多久就被死死地封在了涨停板上。(来源:Wind)……
春天的云春天的云多姿多彩,有时一天中会有多种不同的变化。早晨,云朵白白的,天空蓝蓝的。云朵像蓝天上镶的白玉,蓝天像云朵盖的被子。云朵有很多的形状。有的软绵绵的,像一棵棵香甜可口的……关于去芳洲公园玩作文800字今天下午3点前,我和沈奕锟约好去芳洲公园玩,不过我们要先完成好妈妈布置的作业,去芳洲公园玩作文800字。我就开始写作业,默写了全部的词语,还读了英语,还练习了钢琴。我对妈……奉献名言积极奉献的名言(六)1、鞠躬尽瘁,死而后已。诸葛亮2、一个人应当一次只想一件东西,并持之以恒,这样便有希望得到它。但是我却什么都想,结果是什么也抓不着。每次我都发现,当一个所追求的东西唾手可……小学优秀日记范例100字XX年11月14日星期日天气:晴今天我和哥哥一起给小狗们洗了一次澡,这时水已经热了,我们把小狗放到盆里,它们有些不情愿。我把它们放在里,他们的毛在水里非常洁白,用水轻轻地……支付宝和微信都绑定了银行卡,发生手机丢失怎么办?3步给你搞定如果你的支付宝和微信都绑定了银行卡,在手机发生丢失时,该怎么办,谨记这三步操作可减少损失。我们知道现在使用手机进行消费的已经成为了我们的主要消费方式,出门不需要携带现金,……聆听雨声雨,最令人陶醉的就是那小雨淅淅。雨,总能使人联想到那挪威的森林,法国的乡间小路,以及那美丽的江南水乡。对于雨的记忆于我是很早的,夜间外面下着淅淅小的雨,我蜷在被子里享受着……巨额纳税的阿里巴巴释放出什么信号?【蓝科技】水木随着阿里巴巴年上缴利税516亿,一举成为互联网企业第一纳税大户,构成企业价值体系中的社会责任被推向新的高潮,也标志着企业间正在开始式形成一项不弱于经济指标的……主题分享华为P30系列最新主题,附下载链接本文来自花粉俱乐部论坛小白是大神主题信息主题名称:优化版P30P30Pro官方主题JadeFairyland金玉瑶池主题版本:9。0。1主题作者:EMUI小白……纯洁的使者雪小学作文雪,如梦如幻,如丝如缕,漫天的飞雪,却又壮观雄伟。整一个大地就好像变成了粉装玉砌的世界。它又是纯洁的使者,替整个世界洗去污秽、肮脏与虚假。雪,不停地下着,飞舞的雪花仿佛告……老外发明飞鸟无人机,没有螺旋桨,飞行跟真鸟毫无差别今天要跟大家好好的介绍一个就算是没有浆也能够飞行的无人机。无人机主要是利用一个遥控以及内部的程序来进行控制,从而使它成为了一个不能载人的空中飞机,它也能利用计算机来进行自动控制……美丽的冬天作文范文4篇冬天的雪花是美丽的,那雪一下就是一整天,每一片都差不多跟鹅毛般大小,下面是小编为大家整理的美丽的冬天作文范文,仅供参考,欢迎大家阅读。美丽的冬天作文范文(一)冬姑娘送走了……超线程多核多处理器区别1超线程技术每个单位时间内,CPU只能处理一个线程(Thread)。除非有两个核心处理单元,否则要想在单位时间内处理超过一个的线程是不可能的。超线程HT(Hyper……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网