当前位置: 首页 > 后端技术 > Java

自从使用了Stream,代码更加简洁优雅!

时间:2023-04-01 19:49:38 Java

来源:blog.csdn.net/qq_41698074/article/details/108502976前言虽然Java8已经引入了stream,但是大多数人并没有用到这个非常好用的特性。使用stream让代码更简洁易读,让你明白stream的方便。数组转集合的技巧相信经常使用LeetCode的朋友偶尔会遇到需要将List和基本类型数组进行转换,然后需要这样写代码://StoreList元素到数组中Listlist=newArrayList<>(Arrays.asList(1,2,3,4,5));int[]arr=newint[list.size()];Integer[]temp=list.toArray(newInteger[0]);for(inti=0;ilist=newArrayList<>();for(intval:arr){list.add(val);}虽然上面两个转换不是太麻烦,但是每次都需要写一个loop,尤其是数组转List的时候需要用到临时数组的时候,会让人看着不舒服,但是如果用stream,那就很不一样了。使用stream实现相同功能的代码如下://StoreListelementsinanarrayListlist=newArrayList<>(Arrays.asList(1,2,3,4,5));int[]arr=list.stream().mapToInt(Integer::intValue).toArray();//将数组元素存入Listint[]arr={1,2,3,4,5};Listlist=IntStream.of(arr).装箱()。收集(收集器。toList());可以发现,通过使用stream,我们可以写出更连贯的代码,代码更可靠易维护,可以专注于业务功能。相信即使你对lambda语法感兴趣也不会太熟悉,看了上面的代码也很容易理解。统计数组元素的个数假设我们现在需要统计并输出一个元素重复的数组中每个元素和对应元素出现的次数。相信大家可以想象到,我们可以通过使用一个Map来轻松解决这个问题。代码如下:String[]arr={"a","c","a","b","d","c"};Mapmap=newHashMap<>();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"};Mapmap=newHashMap<>();for(Strings:arr){map.put(s,map.getOrDefault(s,0)+1);}map.forEach((key,值)->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相同的元素时,将它们的值相加,这样就实现了每个元素个数的统计基础数据类型的自定义排序arrays有时候我们会遇到自定义排序基本数据类型数组的情况,不像封装类型的数组和集合可以直接使用比较器,我们只能将基本数组类型的数组转换成封装类型存储在一个集合中,然后排序完成后转换为基本类型的数组。再者,我们只能通过手写排序算法,修改排序算法中的比较来实现。无论使用哪种方法,我们都没有办法把重点放在逻辑功能上,必须额外写一些代码,甚至修改底层逻辑,就像下面的代码(实现数组倒序):int[]arr={1,5,9,7,2,3,7,-1,0,3};//将数组转换为包装类型,然后进行自定义排序Integer[]temp=newInteger[arr.length];for(inti=0;ilist=newArrayList<>();for(intval:arr){列表。add(val);}list.sort(Collections.reverseOrder());for(inti=0;ie,e->1,Integer::sum)).entrySet()。stream().sorted((m1,m2)->m2.getValue()-m1.getValue()).limit(k).mapToInt(Map.Entry::getKey).toArray();}}本文小结这里有几个简单实用的stream使用技巧。当然,stream的应用远不止于此。希望本文能引起大家学习流的兴趣。本文如有错误,欢迎大家指正。近期热点文章推荐:1.1000+Java面试题及答案(2022最新版)2.厉害了!Java协程来了。..3.SpringBoot2.x教程,太全面了!4.不要用爆破爆满画面,试试装饰者模式,这才是优雅的方式!!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!