首页 > 解决方案 > 保证流上的过滤器+迭代器

问题描述

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

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

标签: javaiteratorjava-stream

解决方案


我对此很好奇,所以我设计了这个来看看我是否理解这个问题。以下修改了一个对象,它确实影响了过滤器。不过我可能不理解这个问题。

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

推荐阅读