gpt4 book ai didi

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

转载 作者:qq735679552 更新时间:2022-09-27 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章Map 使用 Lambda 的 forEach 实现跳出循环操作由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static void main(String[] args) {
   HashMap<String,String> 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 。

?
1
2
3
4
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,以下给出测试数据.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
public static void main(String[] args) {
     test1();
   }
 
   public static void test1() {
     List<User> 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<User> 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<User> userList) {
     for (User user : userList) {
       user.hashCode();
     }
   }
 
   /**
    * lambda forEach测试
    *
    * @param userList
    */
   private static void testLambda(List<User> userList) {
     userList.forEach(user -> user.hashCode());
   }
 
   private static void testLambda1(List<User> userList) {
     userList.forEach(user -> user.hashCode());
   }
 
   /**
    * 初始化测试集合
    *
    * @param size
    * @return
    */
   private static List<User> initList( int size) {
     List<User> userList = new ArrayList<>();
     for ( int i = 0 ; i < size; i++) {
       userList.add( new User());
     }
     return userList;
   }

测试结果:

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

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

测试结果:

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

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

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

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

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

以上这篇Map 使用 Lambda 的 forEach 实现跳出循环操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我.

原文链接:https://blog.csdn.net/qq_40074764/article/details/106471929 。

最后此篇关于Map 使用 Lambda 的 forEach 实现跳出循环操作的文章就讲到这里了,如果你想了解更多关于Map 使用 Lambda 的 forEach 实现跳出循环操作的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com