范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

相信我,使用Stream真的可以让代码更优雅

  前言
  虽然 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的兴趣,本文若有错误之处,也欢迎你的指正。
  来源:blog.csdn.net/qq_41698074/article/details/108502976

浅谈淘宝,京东,拼多多的区别今天再接着聊一下淘宝,京东,拼多多在消费群体方面的区别,要聊这个问题,首先要看一下,三家平台的商家构成。一般来讲商家都遵循一个羊也是放,一群羊也是放的原则,基本在三家平台都有店铺。1月10日(周一)股市资讯个股消息城市大脑发展白皮书正式发布产业链关注度升温近日,由全国信标委智慧城市标准工作组组织编写的城市大脑发展白皮书(2022)正式发布。白皮书由上海数字产业发展有限公司中国电子技术标准化研戴着AppleWatch睡觉,是非常奇怪的行为吗?有意思的是,每次文章提及戴着AppleWatch睡觉,总会有一些人留言表示不理解。在他们看来,戴着AppleWatch睡觉是一种非常奇怪的行为。不过,对习惯戴着AppleWatch华为给荣耀转移了一些专利,所以荣耀magicv仅仅是创新的开始荣耀magicv发布前,一个消息很有意思,华为转移给荣耀很多专利,当然里面就有折叠屏的专利,这个很有意思,另外荣耀的折叠屏基本上就是华为matex2的芯片升级版的思路。这次为什么看荣耀畅玩8C联想拯救者Y90参数报价对比荣耀畅玩8C手机机型荣耀畅玩8C联想拯救者Y90最新价格1099元即将上市屏幕尺寸6。26英寸6。92英寸屏幕类型TFTLCDAMOLED屏幕色彩1670万分辨率152072024互联网电视怎么样发展才不会让人那么讨厌?互联网电视现在已经变成了让人厌倦的一个产品了,为什么呢?因为电视这个产品一旦涉及到互联网之后,它其实就变成了一个开放的终端平台,而不是用户真正能够掌握的播放电视节目的平台了。很多互拼多多499。9,还差0。1就能提现。谁能提现成功?骗爹爹给了我499。95,让我找5个人砍,就能提现。砍到499。99时,转盘不出现金了,出金币,说集齐10枚金币,就可以提现。出了9枚金币后,再砍,变成砍一次0。1枚金币了。然后如依赖高通的安卓旗舰还不如两年前的iPhone11随着搭载高通骁龙8G1的安卓旗舰手机陆续上市,安卓旗舰与苹果也在高端手机市场展开了搏杀,让人遗憾的是不仅iPhone13碾压安卓旗舰,甚至连两年多前的iPhone11都依然有很大的在Vue中使用JSX语法JSX在Vue中使用JSX语法。可以让我们回到更接近模板的语法上。render()return(h1这是一个标题h1)插值this。value指令在JSX中,一些指令并不存在,所以有没有性能和拍照都不错的vivo手机?有的,刚好我才买的vivox70pro,人像和夜景目前排第一吧,也是vivo目前最高的一部拍照手机!那肯定选择今年的新款VIVOx70pro了作为今年VIVO的旗舰拍照机型,和卡尔三星GalaxyS21FE(8GB128GB5G版)怎么样?三星GalaxyS21FE三星GalaxyS21FE(8GB128GB5G版)最新价格是4599元,日常使用还是很流畅的手机!上市时间为2022年01月。首先,我们关注屏幕方面,屏
开了两年对特斯拉model3(我最爱的车)的感受两年前,第一次试车的时候,就觉得方向盘,握起来软乎乎的,感觉像泡沫材质。有一种电子产品的感觉,挺好玩的,就像是开的一个大玩具。不怕大家笑话,我的驾驶证是C2,当初学车的时候,就觉得为什么华为这么遭美国恨,却又打不死?一句话因为华为这样的中国企业,极有可能动了美国的根基倒推一下逻辑关系中美竞争,未来很大程度上,是高科技的竞争包括5G人工智能操作系统芯片高端制造量子计算等,这些是科技发展的底座这里特斯拉CEO马斯克收到死亡威胁世界首富马斯克不知道是钱多了变得疯狂,还是在商业领域找不到对手太寂寞,竞向普京发出挑战,把商用的星链计划改为军用,向乌克兰提供情报信息,使俄罗斯蒙受重大损失,当收到神秘死亡警告时,项立刚为汉芯造假发声汉芯汉芯造假汉芯骗局和方舟败局,为什么绕开不说?特斯拉起诉项立刚项立刚洗白汉芯近日项立刚为汉芯造假事件发声,认为陈进所作所为是逼不得已,当时回国得不到资金支持,自己出钱和交大搞研究碧桂园开始用机器人造房子,智能建造时代或将到来不久前,会做200多道中外菜肴的智能机器人受到外媒及外国运动员的围观。随着机器人频频走进我们的视野,让人不禁想问,难不成机器人时代真的已经到来了吗?人民日报在不久前发表的加紧谋划布互联网卖房,巨头盯上新生意作者丨牧歌编辑丨坚果近日,据多家媒体报道,快手已经正式成立房产业务中心,探索大宗线下交易业务。而早在去年10月,已有媒体查询爱企查信息发现,快手的全资子公司成都快购科技有限公司发生无人机航拍摄影三维实景建模随着经济建设迅猛发展,各地区的地貌发生巨大变迁,现有的航空遥感技术手段已无法适应经济发展的需要。以无人驾驶飞机为空中遥感平台的技术,能够较好地满足现阶段我国对航空遥感业务的需求,在智能马桶进入2。0时代安全无接触将成未来主流距离智能马桶的问世已经有好些年了,如今的智能马桶已从最初与智能马桶盖的不分仲伯进化到了如今的全新形态。尤其受此次新冠疫情的影响,智能马桶行业更是向着健康安全的方向发展,而全新的无接C界面开发框架Qt6。x入门指南QtWidget布局管理(四)Qt布局系统提供了一种简单而强大的方式来自动排列小部件内的子小部件,以确保它们充分利用可用空间。Qt跨平台的C图形用户界面库,最新版免费下载,在线文档,视频教程,Qt正版购买慧都网极氪取消购车权益蔚来ET7交付不足两月即调价新能源汽车涨价潮仍在持续财联社5月13日讯(记者,徐昊)进入5月,新能源汽车迎来又一波涨价潮。与以往不同是的,这次调价是从购车权益下手的。5月13日,吉利旗下高端智能品牌极氪汽车宣布,受上游原材料价格持续数字化工厂建设内容分析与实践数字化工厂是近几年随着国家智能制造2025战略国际5G发展战略等方向指引下整个制造产业转型升级的发展方向,主要内容就是通过数字和智能制造作为关键技术应用到数字化工厂,是现代工业化和