Java Lambda表达式forEach无法跳出循环的解决思路

Java Lambda表达式forEach无法跳出循环的解决思路

如果你使用过forEach方法来遍历集合,你会发现在lambda表达式中的return并不会终止循环,这是由于lambda的底层实现导致的,看下面的例子:

public static void main(String[] args) {
    List<String> list = Lists.newArrayList();
    list.add("a");
    list.add("b");
    list.add("c");

    list.forEach(s -> {
        System.out.println("s = " + s);
        if (s.equals("b")) {
            return;
        }
    });
}
//返回结果:
//s = a
//s = b
//s = c

可以看到在forEach方法中即是采用了return,循环却仍在继续,那有什么办法能跳出循环呢?

可以通过抛异常的方法:

public static void main(String[] args) {
    List<String> list = Lists.newArrayList();
    list.add("a");
    list.add("b");
    list.add("c");

    try {
        list.forEach(s -> {
            System.out.println("s = " + s);
            if (s.equals("b")) {
                throw new RuntimeException();
            }
        });
    }catch (Exception e){}
}
//返回结果:
//s = a
//s = b

但仔细想想,这样也太挫了,其实可以换一种思路,跳出的前提肯定是满足了某一条件的,所以可以使用anyMatch()方法:

anyMatch()里接收一个返回值为boolean类型的表达式,只要返回true就会终止循环,这样可以将业务逻辑写在返回判断结果前。

public static void main(String[] args) {
    List<String> list = Lists.newArrayList();
    list.add("a");
    list.add("b");
    list.add("c");

    list.stream().anyMatch(s -> {
        System.out.println("do something");
        System.out.println("s=" + s);
        return s.equals("b");
    });
}
// do something
// s=a
// do something
// s=b

同理,采用类似的思路可以使用filter()方法,思路是一样的,其中findAny表示只要找到满足的条件时停止。

public static void main(String[] args) {
    List<String> list = Lists.newArrayList();
    list.add("a");
    list.add("b");
    list.add("c");

    list.stream().filter(s -> {
        System.out.println("s=" + s);
        return s.equals("b");
    }).findAny();
}
//返回结果:
//s = a
//s = b

原文地址:https://www.cnblogs.com/keeya/p/11306254.html

时间: 2024-10-08 11:36:21

Java Lambda表达式forEach无法跳出循环的解决思路的相关文章

Java Lambda表达式入门[转]

原文链接: Start Using Java Lambda Expressions http://blog.csdn.net/renfufei/article/details/24600507 下载示例程序 Examples.zip .原文日期: 2014年4月16日 翻译日期: 2014年4月27日翻译人员: 铁锚简介(译者注:虽然看着很先进,其实Lambda表达式的本质只是一个"语法糖",由编译器推断并帮你转换包装为常规的代码,因此你可以使用更少的代码来实现同样的功能.本人建议不要

Java Lambda表达式入门

原文链接: Start Using Java Lambda Expressions 下载示例程序 Examples.zip . 原文日期: 2014年4月26日 翻译日期: 2014年4月27日 翻译人员: 铁锚 简介 (译者注:虽然看着很先进,其实Lambda表达式的本质只是一个"语法糖",由编译器推断并帮你转换包装为常规的代码,因此你可以使用更少的代码来实现同样的功能.本人建议不要乱用,因为这就和某些很高级的黑客写的代码一样,简洁,难懂,难以调试,维护人员想骂娘.) Lambda表

使用Java lambda表达式实现Flink WordCount

本篇我们将使用Java语言来实现Flink的单词统计. 代码开发 环境准备 导入Flink 1.9 pom依赖 <dependencies> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-java</artifactId> <version>1.9.0</version> </dependency> <de

Java多线程与高并发:高并发解决思路

Java多线程与高并发:高并发解决思路 小玲子之凌空蹈虚关注 122018.11.21 09:55:30字数 1,553阅读 4,228 來源:http://www.wangtianyi.top/blog/2018/05/11/javaduo-xian-cheng-yu-gao-bing-fa-liu-gao-bing-fa-jie-jue-si-lu/ 缓存并发 image.png 当大量请求访问同一个没有被缓存的数据的时候,会发送大量请求给数据库,导致数据库压力过大,还会导致一致性问题,所以

java lambda表达式学习笔记

lambda是函数式编程(FP,functional program),在java8中引入,而C#很早之前就有了.在java中lambda表达式是'->',在C#中是‘=>’. 杜甫说:射人先射马,擒贼先擒王.学习一个库要学习它的入口类.lambda的入口类是Stream,一看Stream中的函数就会发现Function,Predicate等lambda元素. 一.几个概念     函数式接口 Functional Interface,除了static和default类型的方法外,只有一个函数

Java Lambda 表达式的几各形式

一.Lambda表达式的组成主要有传入参数列表(参数1,参数2,...),箭头 ->,及返回值,可以是某个值,或者结构体. 如下举一个小小的例子: 在没有使用Lambda表达式时: import java.util.stream.Stream; /** * * @author Kangjun */ public class Demo { public static void main(String[] args){ Dog dog1 = new Dog("dog1",2); Do

Java Lambda 表达式的奇幻之旅

JDK 8 对 Lambda 函数编程的支持,浅的来说无非是引入了一些新的语法结构,是继JDK5 引入的Generics后又一项对大家编码方式的一种革新,如果你不跟上的话,恐怕过段时间,你会认为Java代码成了火星语.深的来说,Java是在语言级进一步支持多核CPU的环境下的并行处理,这在Stream API 中可见一斑,在Java之前,已经有很多主流语言,像 C#和C++,支持Lambda 函数编程,此次Java引入Lambda支持也算后知后觉了. 想在Java中书写Lambda的代码,有两个

Java Lambda表达式 实现原理分析

https://blog.csdn.net/qq_37960603/article/details/85028867 在类编译时,会生成一个私有静态方法+一个内部类. 在内部类中实现了函数式接口,在实现接口的方法中,会调用编译器生成的静态方法. 在使用lambda表达式的地方,通过传递内部类实例,来调用函数式接口方法. 原文地址:https://www.cnblogs.com/eryun/p/12149841.html

java lambda表达式

ArrayList<String> list = new ArrayList<String>(); list.add(0, "b"); list.add(1, "a"); list.add(0, "c"); list.add(1, "d"); ITopable<String> sortDesc = ((strList) -> { String tmp = null; for (Stri