跳出Lambda表达式forEach()循环解决思路

这篇具有很好参考价值的文章主要介绍了跳出Lambda表达式forEach()循环解决思路。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

在一次需求开发时,发现使用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);
    }

运行结果:
跳出Lambda表达式forEach()循环解决思路,小白启程,java,lambda,后端
可以看出在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);
   }

执行结果:
跳出Lambda表达式forEach()循环解决思路,小白启程,java,lambda,后端

  • 使用普通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()循环解决思路,小白启程,java,lambda,后端

总结

Lambda表达式forEach()函数不支持return跳出循环,不建议使用抛异常方式结束循环,可以考虑使用普通for或利用Lambda表达式的函数实现。文章来源地址https://www.toymoban.com/news/detail-693917.html

到了这里,关于跳出Lambda表达式forEach()循环解决思路的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 进阶JAVA篇- Lambda 表达式与 Lambda 表达式的省略规则

    目录         1.0 什么是 Lambda 表达式?         1.1 既然跟匿名内部类相关,先来回顾匿名内部类。          1.2 Lambda 表达式与匿名内部类之间的关系。         1.3 函数式接口         1.4 在具体代码中来操作一下         2.0 Lambda 表达式省略规则          Lambda 表达

    2024年02月08日
    浏览(52)
  • 探索Python中的函数式编程:Lambda表达式与函数式工具【第135篇—Lambda表达式】

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在Python编程世界中,函数式编程逐渐成为了一种流行的范式,特别是在处理数据和编写简洁、高效代码时。函数式编程的核心思想是将计算视

    2024年04月08日
    浏览(83)
  • .NET写一个自己的Lambda表达式与表达式树

    LambdaExpression继承Expression Expression 又继承LambdaExpressio 所以,LambdaExpression与 Expression 的区别在于:泛型类以静态类型的方法标识了它是什么种类的表达式,也就是说,他确定了返回类型和参数。所以显然,TDelegate必须是一个委托类型。 注意 :并非所有的Lambda表达式都能转换成

    2024年02月13日
    浏览(46)
  • 【JAVA】包装类、正则表达式、Arrays类、Lambda表达式

    包装类是8种基本数据类型对应的引用类型 作用:后期的集合和泛型不支持基本类型,只能使用包装类 基本数据类型和其对应的引用数据类型的变量可以互相赋值 基本数据类型 引用数据类型 byte Byte short Short int Integer long Long char Character float Float double Double boolean Boolean 包装类

    2024年02月13日
    浏览(56)
  • 23.Lambda表达式

    Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。Lambda表达式是Java SE 8中一个重要的新特性。

    2024年02月03日
    浏览(40)
  • 深入理解lambda表达式

    var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); app.Use(async (context, next) = { // Add code before request. }); 这段C#代码是用于设置ASP.NET Core应用中的中间件。下面是详细解释: app.Use : 这个方法是用来向应用的请求处理管道中添加一个中间件的。在ASP.NET Core中,中间件用于处

    2024年02月20日
    浏览(45)
  • 9.4 Lambda表达式

    2024年01月22日
    浏览(45)
  • Lambda表达式常用场景

    如果你的集合里泛型是ListString,那么可以直接用String.join(\\\",\\\",你的集合),把它变为字符串。 String.join(\\\",\\\", yourList) 但是如果你的集合是,ListInteger、ListLong,那么String.join这个方法就不适应了. 你可以用lamba表达式 String string= longs.stream().map(Object::toString).collect(Collectors.joining(\\\",\\\")); 方

    2024年02月11日
    浏览(42)
  • C++lambda表达式

                                                              🎬慕斯主页 : 修仙—别有洞天                                                          ♈️ 今日夜电波:Duvet—Bôa                                                

    2024年02月03日
    浏览(47)
  • 「JavaSE」Lambda表达式

    🎇 个人主页 :Ice_Sugar_7 🎇 所属专栏 :快来卷Java啦 🎇 欢迎点赞收藏加关注哦! Lambda表达式是Java SE 8中一个重要的新特性,基于数学中的λ演算得名,也可称为闭包, 它允许我们通过 表达式 代替功能接口 和方法类似,Lambda表达式提供了一个正常的参数列表和一个使用这

    2024年04月11日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包