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

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

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

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<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;
  }

测试结果:

为了验证前面的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表达式的性能。

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

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

(0)

相关推荐

  • Java 8跳过本次循环,继续执行以及跳出循环,终止循环的代码实例

    在Java8之前,最开始使用for i 循环,很老旧,后来有了高级的for each 循环,然后这个跳出本次循环和跳出所有的for循环,都简单,稍微没见过的就是跳出多层for循环. 然后就是Java8出的foreach循环,这个循环里面,break和continue都不管用啦.需要使用return,这个只能跳过本次循环,还是会继续执行for循环的,那么怎么跳出这个Java8的foreach循环呢? 下面对所有的循环,都来了一次操作. 看看如何,跳出当前循环,继续执行:或者直接跳出for循环:或者

  • JAVA8独有的map遍历方式(非常好用)

    使用JAV8 带来的map遍历方式使遍历非常简单 public class LambdaMap { private Map<String, Object> map = new HashMap<>(); @Before public void initData() { map.put("key1", "value1"); map.put("key2", "value2"); map.put("k

  • Java编程中使用lambda表达式的奇技淫巧

    为什么使用Lambda表达式 先看几个例子: 第一个例子,在一个独立的线程中执行某项任务,我们通常这么实现: class Worker implements Runnable { public void run() { for (int i = 0; i < 100; i++) doWork(); } ... } Worker w = new Worker(); new Thread(w).start(); 第二个例子,自定义字符串比较的方法(通过字符串长度),一般这么做: class Leng

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

    Lambda 的 forEach表达式用起来很爽啊,最近开发中用来遍历了一下Map,结果就翻车了......大致场景如下: public static void main(String[] args) { HashMap<String,String> map = new HashMap<>(); map.put("1","001"); map.put("2","002"); map.put("

  • 在lambda的foreach遍历中break退出操作(lambda foreach break)

    前言 Q: 当我们需要在lambda的遍历循环中返回或者退出,应该怎么办? A: 在lambda的foreach中是不能用break的,这相当不人性化.但是别忘了,用回默认的forEach遍历是可以的. >>>When using external iteration over an Iterable we use break or return from enhanced for-each loop as:\ //by zhengkai.blog.csdn.net for (SomeO

  • 浅析JS中的 map, filter, some, every, forEach, for in, for of 用法总结

    1.map 有返回值,返回一个新的数组,每个元素为调用func的结果. let list = [1, 2, 3, 4, 5]; let other = list.map((d, i) => { return d * 2; }); console.log(other); // print: [2, 4, 6, 8, 10] 2.filter 有返回值,返回一个符合func条件的元素数组 let list = [1, 2, 3, 4, 5]; let other = list.filter((d,

  • php foreach如何跳出两层循环(详解)

    使用break可以跳出当前循环,那如果想再跳出上一层的循环呢 我们就需要break 2即可 $arr1 = array('a1','a2','a3','a4'); $arr2 = array('b1','b2','b3','b4'); foreach($arr1 as $a1){ foreach($arr2 as $k=>$a2){ if($k=='2'){ break 2; } echo $a1.'==='.$a2.'<br/>'; } } 以上这篇php foreach如何跳出两层循

  • 详解lambda表达式foreach性能分析

    java 8的新特性之一就是lambda表达式,parallelStream()都说性能会比较高,现一探究竟. 话不多说,上代码: @Test public void test2(){ List<String> list = new ArrayList<>(); for(int i=0;i<10000;i++) list.add(String.valueOf(i)); //lambda表达式 long start = System.currentTimeMillis(); /

  • javascript实现label标签跳出循环操作

    出场: 首先我们来说说为什么需要label标签,虽然我们已经知道有break,continue跳出循环,但如果是多重循环那么它们就显的无能为力了,所以就出现了label这个标签来为我们服务. 我们先来看看单独使用break的情况 for(var i=0;i<4;i++){ for(var j=0;j<4;j++){ if(i===1&&j===1){ break; }else{ console.log("i:"+i+"--j:"+j);

  • Java中遍历Map集合的5种方式总结

    方式一 通过Map.keySet使用iterator遍历 @Test public void testHashMap1() { Map<Integer, String> map = new HashMap<>(); map.put(001, "Java"); map.put(002, "数据库"); map.put(003, "Vue"); System.out.println(map); // 通过Map.keySet使

  • java中lambda(函数式编程)一行解决foreach循环问题

    java lambda(函数式编程)一行解决foreach循环 首先给大家推荐<精通lambda表达式:java多核编程> 这本书详细介绍了lambda表达式从入门到理解.应用 下面介绍用以前的循环方式进行对比,来更加清晰地java函数式编程中foreach的用法 一.以前我们使用的for循环 /** * for循环 */ @Test public void forTest() { // 实例化一个List List<Point> points = Arrays.asList(ne

  • Java8中forEach语句循环一个List和Map

    在这篇文章中,我将向您展示如何用新的Java 8 forEach语句循环一个List和Map. 1.forEach 和 Map 1.1.常规循环Map常用的方法. Map<String ,Integer> items = new HashMap<>(); items.put("A",10); items.put("B",20); items.put("C",30); items.put("D",40);

  • JS中的forEach、$.each、map方法推荐

    forEach是ECMA5中Array新方法中最基本的一个,就是遍历,循环.例如下面这个例子: [1, 2 ,3, 4].forEach(alert); 等同于下面这个for循环 var array = [1, 2, 3, 4]; for (var k = 0, length = array.length; k < length; k++) { alert(array[k]); } Array在ES5新增的方法中,参数都是function类型,默认有传参,forEach方法中的function回

随机推荐