ArrayList 可用 forEach() 配合 Lambda 简洁遍历,如 list.forEach(System.out::println);需索引时用 IntStream.range;遍历时修改集合应避免 ConcurrentModificationException,推荐 removeIf 或统一 removeAll;转换数据应使用 stream().map()。

Java 中 ArrayList 可以通过 forEach() 方法配合 Lambda 表达式简洁遍历,无需传统 for 循环或 Iterator。
用 forEach() + Lambda 遍历每个元素
ArrayList 继承自 Collection,天然支持 forEach(Consumer) 方法。Lambda 可直接作为消费行为传入:
ArrayList<string> list = new ArrayList(Arrays.asList("a", "b", "c"));
list.forEach(s -> System.out.println(s)); // 输出 a, b, c(每行一个)</string>
等价于:
list.forEach(System.out::println); // 方法引用更简洁
遍历时需要索引?用普通 for 或 IntStream
forEach() 不提供下标,若需索引,不建议强行在 Lambda 里维护外部变量(线程不安全、可读性差)。推荐方式:
- 用传统增强 for 配合计数器(简单场景)
- 用
IntStream.range(0, list.size())遍历索引
IntStream.range(0, list.size())
.forEach(i -> System.out.println(i + ": " + list.get(i))); // 输出 0: a, 1: b...
遍历中修改集合?避免 ConcurrentModificationException
在 forEach() 的 Lambda 中调用 list.remove() 或 add() 会触发并发修改异常。安全做法是:
- 收集待删元素,遍历结束后统一
removeAll() - 使用
Iterator.remove()(但不能用 Lambda 直接写,需显式 Iterator) - JDK 8+ 可用
removeIf(Predicate)安全过滤
// 安全删除所有长度为 1 的字符串 list.removeIf(s -> s.length() == 1);
想边遍历边转换?用 stream().map()
如果目标不是“执行动作”,而是“生成新集合”,应走 Stream 流式处理:
List<integer> lengths = list.stream()
.map(String::length)
.collect(Collectors.toList()); // [1, 1, 1]</integer>
注意:stream().forEach() 和 forEach() 语义一致,但前者开启流式管道,适合组合 map/filter 等操作。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











