Java中Iterator作为方法参数的传递方式、原理及示例解析
一、如何传递Iterator作为方法参数
直接将Iterator实例作为参数传入目标方法即可。Iterator实例一般通过集合(比如List、Set)的iterator()方法获取。
举个例子,先从集合拿到Iterator:
List<String> langList = new ArrayList<>(List.of("Java", "Python", "C++")); Iterator<String> iter = langList.iterator();
然后直接把iter传给someMethod:
someMethod(iter);
二、工作原理
Java的参数传递是值传递,但对于对象类型(包括Iterator),传递的是对象引用的副本。也就是说,someMethod里的data参数和你传入的iter指向的是同一个Iterator实例。
这就意味着:在someMethod中对data的操作(比如调用next()、remove())会直接改变原Iterator的状态——原Iterator的游标位置、元素存在状态都会同步变化。
三、在someMethod中使用data对象的示例
在someMethod里,你可以像操作普通Iterator一样使用data,核心操作就是用hasNext()判断是否还有元素,用next()获取元素,支持的话还能用remove()删除当前元素。
示例1:遍历输出所有元素
void someMethod(Iterator<String> data) { // 遍历Iterator的标准写法 while (data.hasNext()) { String element = data.next(); System.out.println("遍历到元素:" + element); } }
调用这个方法后,原Iterator的游标会走到末尾,再调用hasNext()会返回false。
示例2:过滤并删除指定元素
如果Iterator支持remove()(大部分集合的Iterator都支持,只读集合如Arrays.asList()返回的Iterator除外),可以在遍历中删除元素:
void someMethod(Iterator<String> data) { while (data.hasNext()) { String element = data.next(); if (element.startsWith("J")) { // 删除当前遍历到的元素,必须在next()之后调用 data.remove(); System.out.println("删除元素:" + element); } } }
注意:调用remove()前必须先调用next(),否则会抛出IllegalStateException。
四、完整代码演示
import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class IteratorPassDemo { public static void someMethod(Iterator<String> data) { System.out.println("=== 开始在someMethod中遍历 ==="); while (data.hasNext()) { String elem = data.next(); System.out.println("当前元素:" + elem); if (elem.equals("Python")) { System.out.println("在someMethod中标记处理Python元素"); } } } public static void main(String[] args) { List<String> langList = new ArrayList<>(); langList.add("Java"); langList.add("Python"); langList.add("C++"); Iterator<String> iter = langList.iterator(); // main方法中先移动一次游标 System.out.println("main方法中先获取第一个元素:" + iter.next()); // 传递Iterator给someMethod someMethod(iter); // 此时原Iterator的游标已到末尾 System.out.println("\nmain方法中检查是否还有元素:" + iter.hasNext()); } }
运行结果:
main方法中先获取第一个元素:Java === 开始在someMethod中遍历 === 当前元素:Python 在someMethod中标记处理Python元素 当前元素:C++ main方法中检查是否还有元素:false
从结果能看到:someMethod会接着main方法中移动后的游标继续遍历,所有操作都会同步到原Iterator实例。
内容的提问来源于stack exchange,提问作者Raj Kumar Barman

