• 那是从何处传来的钟声呢?偶尔听到那钟声,平添一份喜悦与向往之情。

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

后端 Nanait 4年前 (2020-12-03) 2170次浏览 已收录 0个评论 扫描二维码

如果你使用过 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

何处钟 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Java Lambda 表达式 forEach 无法跳出循环的解决思路
喜欢 (0)
[15211539367@163.com]
分享 (0)

您必须 登录 才能发表评论!