## 一、什么是forEach方法? 在 Java 集合框架中,`forEach` 方法是一种**函数式编程风格**的遍历方式,自 Java 8 起引入。它位于 `Iterable` 接口中(所有集合类都实现了该接口),作用是**对集合中的每个元素执行指定的操作**。 底层原理: 默认实现基于迭代器(`Iterator`),等同于 ```java for (T item : this) { action.accept(item); } ``` ## 二、方法示例 #### 1、list、set及map示例 ```java // list、set都可以 List list = new ArrayList<>(); list.add("a"); list.add("b"); list.add("c"); // lambda表达式 list.forEach(item -> { System.out.println(item); }); // 方法引用 list.forEach(System.out::println); Map map = new HashMap<>(); map.put(1, "a"); map.put(2, "b"); map.put(3, "c"); map.forEach((key, value) -> { System.out.println(key + ":" + value); }); ``` #### 2、什么是lambda表达式? [Java的Lambda表达式解析](https://www.soki.me/archives/218.html) #### 3、什么是方法引用? [Java 方法引用解析](https://www.soki.me/archives/217.html) ## 三、与传统循环遍历的区别 | 特性 | `forEach` | 增强 for 循环 (`for-each`) | | ---------- | ------------------------------- | -------------------------- | | 语法简洁性 | ⭐️⭐️⭐️ (Lambda/方法引用) | ⭐️⭐️ (显式声明元素) | | 流程控制 | ❌ (无法使用`break`/`continue`) | ✅ | | 修改集合 | ❌ (可能引发并发修改异常) | ❌ (相同限制) | | 函数式支持 | ✅ (链式操作) | ❌ | ## 四、可能出现的异常 1、**并发修改异常**: * 遍历过程中直接调用集合的 `remove()` 或 `add()` 会抛出 `ConcurrentModificationException`。 * 解决方案:使用迭代器的 `remove()` 方法,或 Java 8+ 的 `removeIf()`。 2、**性能**: * 简单遍历时与增强 for 循环性能接近。 * 复杂场景(如并行流)可用 `parallelStream().forEach()`(需注意线程安全)。 3、**流程控制限制**: * `forEach` 无法使用 `break`/`continue`,需改用传统循环或异常机制(不推荐)。 Loading... ## 一、什么是forEach方法? 在 Java 集合框架中,`forEach` 方法是一种**函数式编程风格**的遍历方式,自 Java 8 起引入。它位于 `Iterable` 接口中(所有集合类都实现了该接口),作用是**对集合中的每个元素执行指定的操作**。 底层原理: 默认实现基于迭代器(`Iterator`),等同于 ```java for (T item : this) { action.accept(item); } ``` ## 二、方法示例 #### 1、list、set及map示例 ```java // list、set都可以 List<String> list = new ArrayList<>(); list.add("a"); list.add("b"); list.add("c"); // lambda表达式 list.forEach(item -> { System.out.println(item); }); // 方法引用 list.forEach(System.out::println); Map<Integer, String> map = new HashMap<>(); map.put(1, "a"); map.put(2, "b"); map.put(3, "c"); map.forEach((key, value) -> { System.out.println(key + ":" + value); }); ``` #### 2、什么是lambda表达式? [Java的Lambda表达式解析](https://www.soki.me/archives/218.html) #### 3、什么是方法引用? [Java 方法引用解析](https://www.soki.me/archives/217.html) ## 三、与传统循环遍历的区别 | 特性 | `forEach` | 增强 for 循环 (`for-each`) | | ---------- | ------------------------------- | -------------------------- | | 语法简洁性 | ⭐️⭐️⭐️ (Lambda/方法引用) | ⭐️⭐️ (显式声明元素) | | 流程控制 | ❌ (无法使用`break`/`continue`) | ✅ | | 修改集合 | ❌ (可能引发并发修改异常) | ❌ (相同限制) | | 函数式支持 | ✅ (链式操作) | ❌ | ## 四、可能出现的异常 1、**并发修改异常**: * 遍历过程中直接调用集合的 `remove()` 或 `add()` 会抛出 `ConcurrentModificationException`。 * 解决方案:使用迭代器的 `remove()` 方法,或 Java 8+ 的 `removeIf()`。 2、**性能**: * 简单遍历时与增强 for 循环性能接近。 * 复杂场景(如并行流)可用 `parallelStream().forEach()`(需注意线程安全)。 3、**流程控制限制**: * `forEach` 无法使用 `break`/`continue`,需改用传统循环或异常机制(不推荐)。 最后修改:2025 年 10 月 13 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 👆请简单粗暴地爱我。