Java中Iterator不直接支持断言,但可通过assert关键字(需开启-ea)、JUnit Assertions(推荐用于测试)、自定义ValidatingIterator或Stream API实现遍历校验。

Java 中 Iterator 本身不直接支持断言(assertion)校验,但可以结合 assert 关键字、JUnit 的 Assertions 或自定义逻辑,在遍历过程中对每个元素做实时校验。
用 assert 关键字在迭代中做简单断言
适用于开发调试阶段,需开启 JVM 断言(-ea 参数),否则断言语句被忽略。
示例:校验集合中所有字符串长度不为 0:
Iterator<string> it = list.iterator();
while (it.hasNext()) {
String s = it.next();
assert s != null : "元素不能为 null";
assert !s.trim().isEmpty() : "字符串不能全为空白";
}
</string>
注意:assert 在生产环境默认关闭,不可用于关键业务校验。
用 JUnit 5 Assertions 配合迭代做测试断言
在单元测试中更可靠,失败时抛出明确异常并输出上下文信息。
推荐写法(避免提前退出,收集全部错误):
- 使用
Assertions.assertAll()批量执行断言,即使某一项失败,其余仍会执行 - 为每个元素带上索引或标识,便于定位问题
示例:
List<integer> numbers = Arrays.asList(1, -5, 0, 10);
Iterator<integer> it = numbers.iterator();
int index = 0;
Assertions.assertAll("验证所有数字为非负",
() -> {
while (it.hasNext()) {
Integer n = it.next();
Assertions.assertTrue(n >= 0, () -> "索引 " + index + " 处数值 " + n + " 小于 0");
index++;
}
}
);
</integer></integer>
也可改用增强 for 循环配合 assertAll,更简洁(本质仍是迭代)。
封装成可复用的校验迭代器
若需在多个地方做类似校验,可包装一个带校验逻辑的迭代器:
public class ValidatingIterator<t> implements Iterator<t> {
private final Iterator<t> delegate;
private final Predicate<t> validator;
private final String errorMsg;
public ValidatingIterator(Iterator<t> it, Predicate<t> validator, String errorMsg) {
this.delegate = it;
this.validator = validator;
this.errorMsg = errorMsg;
}
@Override
public boolean hasNext() {
return delegate.hasNext();
}
@Override
public T next() {
T item = delegate.next();
if (!validator.test(item)) {
throw new IllegalArgumentException(errorMsg + ": " + item);
}
return item;
}
}
</t></t></t></t></t></t>
使用方式:
Iterator<string> safeIt = new ValidatingIterator(
list.iterator(),
s -> s != null && s.length() > 3,
"字符串必须非空且长度大于 3"
);
while (safeIt.hasNext()) {
System.out.println(safeIt.next()); // 自动校验,失败立即抛异常
}
</string>
配合 Stream API 更现代的替代方案
虽然问题聚焦 Iterator,但实际开发中,用 Stream 做校验更直观、函数式且易组合:
list.stream()
.filter(Objects::nonNull)
.forEach(s -> {
assert s.length() > 0 : "空字符串";
// 或用 JUnit Assertions.assert...(测试中)
});
或一次性校验全部:
boolean allValid = list.stream()
.allMatch(s -> s != null && s.length() >= 2);
Assertions.assertTrue(allValid, "存在不符合要求的元素");
这种方式语义清晰,也便于后续扩展(如统计、分组、映射等)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











