Map 使用 Lambda 的 forEach 实现跳出循环操作

网友投稿 521 2022-11-22


Map 使用 Lambda 的 forEach 实现跳出循环操作

Lambda 的 forEach表达式用起来很爽啊,最近开发中用来遍历了一下Map,结果就翻车了......大致场景如下:

public static void main(String[] args) {

HashMap map = new HashMap<>();

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

boolean result = map.entrySet().stream().anyMatch(e -> e.getValue().contains("3"));

if (result){

System.out.println("找到你了呦......");

}

补充知识:java8 lambda forEach循环与增强for循环性能对比

最近新的项目使用jdk1.8版本,于是乎博主想多使用一些lambda的写法,但是对于lambda并不是很了解所以在网上查了一些性能方面的资料,结果瞬间心凉,多数回答为lambda forEach循环性能要比传统循环差,性能甚至差出十几倍。然而,经过博主的测试那些回答是错误的。

性能对比的结论为 lambda forEach>增强for,以下给出测试数据。

public static void main(String[] args) {

test1();

}

public static void test1() {

List userList = initList(10000);

for (int i = 1; i < 11; i++) {

System.out.println("--------------------第" + i + "次");

long t1 = System.nanoTime();

testLambda(userList);

long t2 = System.nanoTime();

testForeach(userList);

long t3 = System.nanoTime();

System.out.println("lambda---" + (t2 - t1) / 1000 + "s");

System.out.println("增强for--" + (t3 - t2) / 1000 + "s");

}

}

public static void test2() {

List userList = initList(10000);

long t1 = System.nanoTime();

testLambda(userList);

long t2 = System.nanoTime();

testForeach(userList);

long t3 = System.nanoTime();

testLambda1(userList);

long t4 = 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测试

*

* @param userList

*/

private static void testForeach(List userList) {

for (User user : userList) {

usekKOAKgdr.hashCode();

}

}

/**

* lambda forEach测试

*

* @param userList

*/

private static void testLambda(List userList) {

userList.forEach(user -> user.hashCode());

}

private static void testLambda1(List userList) {

userList.forEach(user -> user.hashCode());

}

/**

* 初始化测试集合

*

* @param size

* @return

*/

private static List initList(int size) {

List userList = new ArrayList<>();

for (int i = 0; i < size; i++) {

userList.add(new User());

}

return userList;

}

测试结果:

为了验证前面的lomda表达式对后面的lomda表达式的影响,将main方法中的test1改为test2测试。

测试结果:

综上所述此时可以看出在第一次的时候两者性能相差40倍,这可能也是多数人认为它性能较差的原因,但是再后面的执行当中几乎都是lambda的执行速度快,所以博主觉得,lambda的forEach循环在首次执行的时候会初始化部分内容,从而导致执行过慢,在后续的执行当中由于不需要再次进行初始化,所以才展现出真正的实力。

因 此 博 主 推 荐 将 l a m b d a 表 达 式 的 初 始 化 放 到 项 目 启 动 的 过 程 中 , 这 样 可 以 大 大 提 高 l a m b d a 表 达 式 的 性 能 。

\color{#FF0000}{因此博主推荐将lambda表达式的初始化放到项目启动的过程中,这样可以大大提高lambda表达式的性能。}因此博主推荐将lambda表达式的初始化放到项目启动的过程中,这样可以大大提高lambda表达式的性能。

关于其他方面的测试,有兴趣的同学可以自行测试。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:SpringBoot集成Nacos的详细教程
下一篇:Maven是什么?Maven的概念+作用+仓库的介绍+常用命令的详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~