Java中无需for循环为Person列表填充连续序号的优化方案
更简洁高效的实现方式
你当前用的普通for循环本身已经非常高效,尤其是针对ArrayList这类支持随机访问的集合,直接通过索引访问元素的开销极低。如果追求代码简洁性,可以参考以下几种实现:
1. 流式API(IntStream)
用Java 8+的流式API可以写出更紧凑的代码,性能和普通for循环几乎一致:
IntStream.range(0, personList.size()) .forEach(i -> personList.get(i).setOrder(i + 1));
这种写法保留了索引遍历的高效性,同时代码更简洁,适合随机访问类型的List。
2. 遍历元素+计数器
如果你的List是LinkedList这类非随机访问的集合(get(i)操作是O(n)复杂度),用forEach结合计数器的方式会更高效,同时代码可读性更好:
AtomicInteger counter = new AtomicInteger(1); personList.forEach(person -> person.setOrder(counter.getAndIncrement()));
要是不想用AtomicInteger,也可以用int数组模拟可变计数器(lambda要求变量为有效final):
int[] counter = {1}; personList.forEach(person -> person.setOrder(counter[0]++));
这种方式直接遍历集合元素,避免了非随机访问List中get(i)的重复遍历开销。
总结
- 若使用ArrayList等随机访问集合:普通for循环、IntStream写法效率几乎无差别,按需选择简洁性即可。
- 若使用LinkedList等非随机访问集合:
forEach+计数器的方式性能更优。
内容的提问来源于stack exchange,提问作者David Anton Alvarez
相关产品推荐
相关产品推荐

