当前位置: 首页 > news >正文

长期供应网站设计制作seo实战论坛

长期供应网站设计制作,seo实战论坛,动态的网站怎么做,网站建设 网站开发背景 在一次需求开发时&#xff0c;发现使用Lambda的forEach()跳不出循环。如下示例代码&#xff0c;想在遍历满足条件时跳出循环。 public static void main(String[] args) {List<Integer> list Arrays.asList(1, 4, 5, 7, 9, 11);list.forEach(e -> {if (e % 2 …

背景

在一次需求开发时,发现使用Lambda的forEach()跳不出循环。如下示例代码,想在遍历满足条件时跳出循环。

    public static void main(String[] args) {List<Integer> list = Arrays.asList(1, 4, 5, 7, 9, 11);list.forEach(e -> {if (e % 2 == 0) {System.out.println("foreach -- " + e);return;}System.out.println(e);});System.out.println(list);}

运行结果:
在这里插入图片描述
可以看出在forEach()中使用return并不会退出整个循环,和普通for循环return意义不同,仍会继续遍历。

原因

在普通for循环中,跳出循环使用break,结束本次循环使用continue,结束for循环所在的整个执行方法使用return。

      for (Integer e : list) {if (e % 2 == 0) {break;  // return直接整个函数终止执行返回,break for循环方法终止执行}System.out.println(e);}

Lambda表达式中,函数式接口Consumer 的抽象方法accept引用实现循环体中的逻辑。
所以forEach()处理一个个的执行方法accept(t),非循环体。在执行方法中使用return将处理方法返回,但不能结束整个forEach()。

    default void forEach(Consumer<? super T> action) {Objects.requireNonNull(action);for (T t : this) {action.accept(t);}}
@FunctionalInterface
public interface Consumer<T> {void accept(T t);default Consumer<T> andThen(Consumer<? super T> after) {Objects.requireNonNull(after);return (T t) -> { accept(t); after.accept(t); };}
}

优化方案

跳出Lambda表达式forEach()循环解决思路有以下几种:

  • 抛异常
    在遍历时,若需要跳出循环,通过抛异常结束forEach()循环,在循环外catch异常不处理。首先此方案不够优雅,其次若循环逻辑块中有其他抛异常的地方,会受影响不易发现。
   public static void main(String[] args) {List<Integer> list = Arrays.asList(1, 4, 5, 7, 9, 11);try {list.forEach(e -> {if (e % 2 == 0) {System.out.println("foreach -- " + e);throw new RuntimeException("跳出循环");}System.out.println(e);});} catch (Exception e) {}System.out.println(list);}

执行结果:
在这里插入图片描述

  • 使用普通for循环
    使用普通for循环替代Lambda表达式forEach()循环,在代码块中使用break即可跳出循环。

  • 使用Lambda表达式filter()实现
    换个实现思路,诉求是遍历list遇到第一个满足条件的item跳出循环,那么转成过滤整个list,返回第一个满足条件的item。

Optional<Integer> first = list.stream().filter(e -> e % 2 == 0).findFirst();
System.out.println(first.orElse(null));
  • 使用anyMatch()
    原理类似filter(),遇到满足条件的item跳出遍历返回。
      list.stream().anyMatch(e -> {if (e % 2 == 0) {System.out.println("跳出循环 -- " + e);return true;}System.out.println(e);return false;});

执行结果:
在这里插入图片描述

总结

Lambda表达式forEach()函数不支持return跳出循环,不建议使用抛异常方式结束循环,可以考虑使用普通for或利用Lambda表达式的函数实现。

http://www.zhongyajixie.com/news/4206.html

相关文章:

  • 云南做网站哪家便宜吸引人气的营销方案
  • 外卖网站开发方案个人如何在百度做广告
  • 南通外贸网站推广百度收录网站
  • 顺义建站公司中国500强最新排名
  • 有没有人通过网站建设卖东西的市场营销毕业后做什么工作
  • 个人做电子商务网站企业邮箱格式
  • 一元夺宝网站开发外贸谷歌优化
  • 网站制作企业首页济南seo优化公司助力排名
  • 怎么做网站导航栏廊坊网站设计
  • 网站建设做哪 个会计科目佛山优化网站关键词
  • 微网站模板源代码营销公司排行
  • 和幼儿做网站福州网站排名推广
  • 金汇网站建设网络营销案例ppt
  • 中国建设部门官方网站东莞做好网络推广
  • 做网站不想用微软雅黑了网络推广有前途吗
  • 企业做网站都购买域名吗网站快速优化排名app
  • 怎么做移动网站吗企业管理软件
  • 北京和田合瑞建设有限公司网站黑帽seo是什么意思
  • 昌平网站建设微信公众号软文怎么写
  • 南京做网站的公司百度写一篇文章多少钱
  • 宁国网站建设长沙网站策划
  • 营销网站制作设计常用的网站推广方法
  • 网站开发培训班2023第二波疫情已经到来
  • 国外成人做视频网站怎么在平台上做推广
  • 一个网站可以做多个描述吗广州网站营销seo
  • 河南大学学科建设处网站廊坊关键词优化平台
  • 刷单网站搭建800元做小程序网站
  • 中英文网站后台seo推广专员招聘
  • 如和建立网站销售成功案例分享
  • 厦门网站建设h5成都官网seo服务