java - 保证流上的过滤器+迭代器
问题描述
我在流上使用迭代器进行迭代,如下所示:
Iterator<A> it = myAs.stream().filter(a -> a.isOk()).iterator();
while (it.hasNext()) {
A a = it.next();
a.update();
}
就我而言,通过更新A
开头的myAs
,我可能会影响列表.isOk()
后面的条件。A
是否保证在迭代流的 0...i-1 个元素之后a -> a.isOk()
评估流的第 i 个元素的过滤条件?
换句话说,这段代码是否等同于:
Iterator<A> it = myAs.stream().iterator();
while (it.hasNext()) {
A a = it.next();
if (a.isOk()) {
a.update();
}
}
解决方案
我对此很好奇,所以我设计了这个来看看我是否理解这个问题。以下修改了一个对象,它确实影响了过滤器。不过我可能不理解这个问题。
public static void main(String[] args) {
Foo[] arr = IntStream.range(1, 11).mapToObj(Foo::new).toArray(Foo[]::new);
Iterator<Foo> it = Arrays.stream(arr).peek(System.out::println).filter(
a -> a.v % 2 == 0).iterator();
int count = 0;
while (it.hasNext()) {
System.out.println(it.next());
if (count == 2) {
arr[5].v = 1000; // not affected
arr[6].v = 2000; // affected
}
count++;
}
}
}
class Foo {
public int v;
Foo(int v) {
this.v = v;
}
public String toString() {
return "Foo:" + v;
}
}
推荐阅读
- reactjs - API 密钥是否通过 get 请求公开?
- python - 使用metpy.calc.advection 时出错:AttributeError: crs 属性不可用
- java - 使用@Formular 计算实体属性
- html - css:带有@media查询的iframe标签的响应式样式不起作用
- c# - 可暂停的 System.Timers.Timer
- firebase - BigQuery 与 Cloud SQL 自动扩缩?
- vehicle-routing - jsprit 能解决需求负的 VRPC 还是 VRPB 更好?
- neural-network - 使用无意义的类来预训练模型重要吗?
- node.js - 在 NodeJS 环境中使用 react-native
- google-compute-engine - 有一个谷歌计算云实例 - 我的密码是什么?