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

面试官问:Stream中的map、peek、foreach方法有什么区别?傻傻分不清,.

时间:2023-04-01 18:04:24 Java

背??景前任栈长分享这篇文章在公众号Java技术栈:别再写一堆for循环了!Java8中的Stream可以轻松遍历树结构,真是牛逼!原来的代码是这样的:List

children=all.stream().filter(...).map((m)->{m.setChildList(getChildrens(m,all));returnm;}).collect(Collectors.toList());其中stream使用的map映射,其实还是比较推荐把map改成peek的。你可能会有这样的疑问:为什么要把map换成peek?怎么改?map和peek有什么区别?peek和foreach有什么区别?看到这里,你是不是彻底傻眼了,没问题,本文掌柜强势来分析!另外,这些问题在Java程序员的面试过程中是一定要问的。出镜率极高,Java程序员必懂。我也在Java面试库小程序里面整理了这些题。欢迎来到小程序刷题。peekmap和peek都是Stream提供的流处理方法。先看peek的源码注释:这个方法的存在主要是为了支持调试,当你想看到元素流过管道中的某个点时:翻译:这个方法主要用于支持debug调试,当你想在元素流过管道中的特定点时查看元素:特定点处的流元素,例如:@TestpublicvoidpeekTest1(){Stream.of("one","two","three","four").filter(e->e.length()>3).peek(e->System.out.println("过滤后的值:"+e)).map(String::toUpperCase).peek(e->System.out.println("Mappedvalue:"+e)).collect(Collectors.toList());}输出结果:Filteredvalue:threeMappedvalue:THREEFalteredvalue:fourMappedvalue:FOUR输出filter和map后的流元素陆续。如果你想在实际工作中看到某个过程的结果,可以派上用场。我们分别看一下map和peek的方法参数:可以看到,map接收Function函数接口参数(接收一个参数,返回一个参数),peek接收Consumer函数接口参数(接收一个参数,不返回任何参数)。如果你不明白,请看下面的例子:如果你有如下列表:privateListlanguageList=newArrayList(){{add("java");添加(“蟒蛇”);添加(“C++”);添加(“PHP”);添加(“去”);}};peek方法中的functional接口参数不能有返回值:表示不能像map一样处理流中的元素,然后形成新的流:map的详细用法就不介绍了。如果不清楚,可以看一下栈长分享的这篇文章:Java8map和flatMap的区别?更多Java8系列教程,可关注公众号Java技术栈,在公众号菜单阅读。peek不能修改流中的元素,它只能对元素进行打印或其他外部处理操作。但是如果流元素是引用类型,peek可以实现map的效果:privateListuserList=newArrayList(){{add(newUser("张三"));add(newUser("李四"));add(newUser("王舞"));add(newUser("赵六"));}};@TestpublicvoidpeekTest3(){userList.stream().peek(user->user.setName("peek:"+user.getName())).forEach(System.out::println);}输出结果:SteamPeekTest.User(name=peek:张三)SteamPeekTest.User(name=peek:李四)SteamPeekTest.User(name=peek:王五)SteamPeekTest.User(name=peek:赵六)虽然没有返回值给形成一个新的流,它可以修改引用类型字段的值。这也是为什么fans建议把map换成peek,因为是引用类型,用peek不需要set后return。列表<菜单>子项=全部。溪流()。筛选(...)。map((m)->{m.setChildList(getChildrens(m,all));returnm;}).收集(收集器。toList());修改为:Listchildren=all.stream().filter(...).peek(m->m.setChildList(getChildrens(m,all))).collect(Collectors.toList());是不是更优雅?peek和foreach有什么区别?比如foreach的源码:和peek一样,也是接收Consumer参数。不同的是foreach不返回参数,也就是说foreach会中断流操作,只能用于遍历,不能进行后续的流处理。小结根据文章中的例子,大家应该已经弄清楚map、peek、foreach的区别和用法了。现在总结一下!map:用于映射流中的每一个元素,然后形成一个新的流;peek:用于调试调试流的中间结果,不能形成新的流,但可以修改引用类型字段的值;foreach:用于遍历会中断流操作;那么,大家明白了吗?还有谁用错了,请把这篇文章发给他,让大家少走弯路,少写垃圾代码,共同进步。本文所有完整示例源码均已上传:https://github.com/javastacks...欢迎Star学习,这??里将提供以下Java示例!好了,今天的分享就到这里。稍后栈长会分享更多有趣的Java技术和最新的技术资料。关注公众号Java技术栈第一时间推送。我也会分享主流的Java面试题和参考答案。全部搞定后在公众号后台回复关键词“面试”刷题。版权声明:本文为公众号《Java技术栈》原创。转载、引用本文内容请注明出处。抄袭、洗稿均为侵权投诉,后果自负,并保留追究法律责任的权利。近期热点文章推荐:1.1000+Java面试题及答案(2022最新版)2.厉害了!Java协程来了。..3.SpringBoot2.x教程,太全面了!4.不要用爆破爆满画面,试试装饰者模式,这才是优雅的方式!!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!