我正在对流使用迭代器进行迭代,如下所示:
Iterator<A> it = myAs.stream().filter(a -> a.isOk()).iterator();
while (it.hasNext()) {
A a = it.next();
a.update();
}
就我而言,可能是通过更新A
开头的myAs
,我将.isOk()
条件影响到列表中稍后的A
。 / p>
是否保证在流的0 ... i-1个元素迭代之后对流的第i个元素的过滤条件 换句话说,这段代码是否等同于:a -> a.isOk()
进行求值?>
Iterator<A> it = myAs.stream().iterator();
while (it.hasNext()) {
A a = it.next();
if (a.isOk()) {
a.update();
}
}
答案 0 :(得分:0)
我对此感到很好奇,因此我设计了此功能以查看是否了解该问题。以下内容修改了一个对象,并且确实影响了过滤器。不过,我可能不太了解这个问题。
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;
}
}