解密 Java ForEach 提前终止问题
2023-12-25 23:37:05
前言:
你是否曾在使用 Java 8 的 forEach 迭代集合时遇到过提前终止循环的问题?在这篇博客中,我们将深入探讨这一问题,并提供多种解决方案。通过场景复现、分析源码,以及详细的解决方案,我们将帮助你理解为什么在 forEach 中无法简单使用 break 或 continue,以及如何巧妙地绕过这一限制。
如果你一直对如何在 Java 中使用 forEach 进行迭代操作感到困扰,那么这篇博客将为你揭示其中的奥秘。跟随我们一起深入研究,并学习在实际项目中如何巧妙应对这一挑战。
让我们开始这段关于 Java ForEach 提前终止问题的编码之旅吧!
场景复现
public class ForEachTest {
public static void main(String[] args) {
String[] strs = {"java", "php", "python", "c++", "c#"};
ArrayList<String> list = new ArrayList<>(Arrays.asList(strs));
list.forEach(e -> {
if (e.contains("python")) {
System.out.print("终止或者跳出循环? ");
return;
}
System.out.print(e + " ");
});
}
}
输出结果:
java php 终止或者跳出循环? c++ c#
结论: 上述代码中,使用 return
无法提前终止 forEach
循环,其效果类似于普通 for
循环中的 continue
关键词。
分析与解决方案
我们通常在普通的 for
循环中使用 break
来跳出循环,而在 Java 8 的 forEach
中无法使用 break
和 continue
。事实上,return
在这里相当于 continue
,并不能达到提前终止循环的效果。
分析源码可知,forEach
是一个 void
方法,使用 return
是为了结束方法而不是跳出循环。
解决方案详解
- 使用原始的增强for循环+return
public static void main(String[] args) {
String[] strs = {"java", "php", "python", "c++", "c#"};
ArrayList<String> list = new ArrayList<>(Arrays.asList(strs));
for (String s : list) {
if (s.contains("python")) {
System.out.print("终止或者跳出循环? ");
return;
}
System.out.print(s + " ");
}
System.out.println("return 后不执行,continue 后继续执行");
}
- 使用原始的增强for循环+continue
public static void main(String[] args) {
String[] strs = {"java", "php", "python", "c++", "c#"};
ArrayList<String> list = new ArrayList<>(Arrays.asList(strs));
for (String s : list) {
if (s.contains("python")) {
System.out.print("终止或者跳出循环? ");
continue;
}
System.out.print(s + " ");
}
System.out.println(" ###return 后不执行,continue 后继续执行");
}
- 抛异常,做双重捕捉
public static void main(String[] args) {
String[] strs = {"java", "php", "python", "c++", "c#"};
ArrayList<String> list = new ArrayList<>(Arrays.asList(strs));
try {
list.forEach(e -> {
if (e.contains("python")) {
System.out.print("终止或者跳出循环? ");
throw new RuntimeException("抛出异常");
}
System.out.print(e + " ");
});
} catch (Exception ignored) {}
}
结论: 使用这些方案可以有效绕过 Java 8 的 forEach
无法使用 break
和 continue
的限制,达到提前终止循环的目的。需要注意捕捉异常时要确保内层没有其他可能抛出的异常。
总结
通过这篇博客,我们深入了解了 Java ForEach 提前终止问题,并提供了多种解决方案。选择合适的方案取决于实际需求和代码结构,希望本文对你解决类似问题时有所帮助。
希望这个改进版的技术博客更符合你的期望,如果有其他需要或调整,随时告诉我。祝你的博客取得成功!
文章来源:https://blog.csdn.net/weixin_44976692/article/details/135211043
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!