Map 使用 Lambda 的 forEach 实现跳出循环操作
Lambda的forEach表达式用起来很爽啊,最近开发中用来遍历了一下Map,结果就翻车了......大致场景如下:
publicstaticvoidmain(String[]args){
HashMapmap=newHashMap<>();
map.put("1","001");
map.put("2","002");
map.put("3","003");
map.put("4","004");
map.put("5","005");
map.forEach((k,v)->{
if(v.contains("3")){
System.out.println("找到你了呦......");
return;
}
System.out.println(v);
});
本来是要在找到包含了"3"的值之后终止循环的,结果break编译错误.只好用return试试,神奇的事情发生了,并没有跳出循环,return在这里起到了continue的效果.为什么呢?---因为()->{}其实是匿名内部类,匿名内部类如何能使用break和continue呢,当然编译错误啊.在匿名内部类里面return了也仅仅是匿名内部类的调用终止,for循环继续下一次循环而已.所以,无奈之下,只能曲线救国了---使用
anyMatch
booleanresult=map.entrySet().stream().anyMatch(e->e.getValue().contains("3"));
if(result){
System.out.println("找到你了呦......");
}
补充知识:java8lambdaforEach循环与增强for循环性能对比
最近新的项目使用jdk1.8版本,于是乎博主想多使用一些lambda的写法,但是对于lambda并不是很了解所以在网上查了一些性能方面的资料,结果瞬间心凉,多数回答为lambdaforEach循环性能要比传统循环差,性能甚至差出十几倍。然而,经过博主的测试那些回答是错误的。
性能对比的结论为lambdaforEach>增强for,以下给出测试数据。
publicstaticvoidmain(String[]args){
test1();
}
publicstaticvoidtest1(){
ListuserList=initList(10000);
for(inti=1;i<11;i++){
System.out.println("--------------------第"+i+"次");
longt1=System.nanoTime();
testLambda(userList);
longt2=System.nanoTime();
testForeach(userList);
longt3=System.nanoTime();
System.out.println("lambda---"+(t2-t1)/1000+"μs");
System.out.println("增强for--"+(t3-t2)/1000+"μs");
}
}
publicstaticvoidtest2(){
ListuserList=initList(10000);
longt1=System.nanoTime();
testLambda(userList);
longt2=System.nanoTime();
testForeach(userList);
longt3=System.nanoTime();
testLambda1(userList);
longt4=System.nanoTime();
System.out.println("lambda---"+(t2-t1)/1000+"μs");
System.out.println("增强for--"+(t3-t2)/1000+"μs");
System.out.println("lambda1---"+(t4-t3)/1000+"μs");
}
/**
*增强for测试
*
*@paramuserList
*/
privatestaticvoidtestForeach(ListuserList){
for(Useruser:userList){
user.hashCode();
}
}
/**
*lambdaforEach测试
*
*@paramuserList
*/
privatestaticvoidtestLambda(ListuserList){
userList.forEach(user->user.hashCode());
}
privatestaticvoidtestLambda1(ListuserList){
userList.forEach(user->user.hashCode());
}
/**
*初始化测试集合
*
*@paramsize
*@return
*/
privatestaticListinitList(intsize){
ListuserList=newArrayList<>();
for(inti=0;i
测试结果:
为了验证前面的lomda表达式对后面的lomda表达式的影响,将main方法中的test1改为test2测试。
测试结果:
综上所述此时可以看出在第一次的时候两者性能相差40倍,这可能也是多数人认为它性能较差的原因,但是再后面的执行当中几乎都是lambda的执行速度快,所以博主觉得,lambda的forEach循环在首次执行的时候会初始化部分内容,从而导致执行过慢,在后续的执行当中由于不需要再次进行初始化,所以才展现出真正的实力。
因此博主推荐将lambda表达式的初始化放到项目启动的过程中,这样可以大大提高lambda表达式的性能。
\color{#FF0000}{因此博主推荐将lambda表达式的初始化放到项目启动的过程中,这样可以大大提高lambda表达式的性能。}因此博主推荐将lambda表达式的初始化放到项目启动的过程中,这样可以大大提高lambda表达式的性能。
关于其他方面的测试,有兴趣的同学可以自行测试。
以上这篇Map使用Lambda的forEach实现跳出循环操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。