java - 测试迭代器的第四个对象 - Java
问题描述
是否可以在迭代器中断言第四个对象的唯一值?
我已经看到人们使用迭代器遍历列表的示例,但我不想取出 index 0
to中保存的对象2
,而只是在 index 3
...
我知道我总是可以做到.next().next().next()
的,但这看起来有点……傻。有什么方法可以让我做一些.next(4)
直接的事情吗?
解决方案
迭代器不适用于索引,它们不知道最后一项出现在哪个索引处。它们的唯一目的是遍历元素直到到达终点。
这意味着,如果你想使用第四个元素,你必须调用Iterator::next()
四次。可能会发生迭代器中只有 3 个或更少元素的情况,因此您必须检查Iterator::hasNext()
,否则当没有更多元素并且您next()
再次调用时,NoSuchElementException
会抛出 。
或者,从 Java-8 开始,您可以使用Iterator::forEachRemaining(Consumer<? super E> action)
为每个剩余元素执行给定操作的方法。此外,您需要对数组使用技巧来避免lambda 表达式中有效的最终变量约束。可悲的是,这个方法不接受BiConsumer<T,U>
作为参数来消耗不仅元素而且它的索引 - 这就是为什么这个技巧。
List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
int index[] = new int[]{0};
// Prints 4 and 8
Iterator<Integer> iterator = list.iterator();
iterator.forEachRemaining(i -> {
if ((index[0]+1)%4 == 0) {
// Here you work both with the element `i` and its index `index[0]`
System.out.println(i);
}
index[0]++;
});
推荐阅读
- javascript - 不适用于来自 ajax 文本文件数据的数组的 indexOf()
- typescript - 打字稿:允许泛型类型仅是具有“字符串”属性的对象
- php - Laravel Cashier 7.2 创建订阅
- android - 在片段中的 EditText 中按 Enter 时修复顶部的工具栏
- javascript - 点击多次后如何提醒
- javascript - Nativescript Javascript 和 Watson Cloud SDK 集成
- python - 使用 Python selenium 选择一个元素(文本)
- laravel - Laravel 使用各自的 ID 显示 created_by 和 edit_by 名称
- c# - 无法连接到 Azure 服务总线队列
- vmware - 如何解决 Android 上的 VMware Airwatch 注册问题?