保证流上的过滤器+迭代器

时间:2019-07-17 13:56:57

标签: java iterator java-stream

我正在对流使用迭代器进行迭代,如下所示:

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();
    }
}

1 个答案:

答案 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;
   }
}