代码之家  ›  专栏  ›  技术社区  ›  Aravind Yarram

大多数迭代器和iterables方法都是懒惰的!这是什么意思

  •  15
  • Aravind Yarram  · 技术社区  · 15 年前

    演示文稿中的1个说“这些方法太懒了!”

    Iterable transform(Iterable, Function)*
    Iterable filter(Iterable, Predicate)*
    T find(Iterable<T>, Predicate)
    Iterable concat(Iterable<Iterable>)
    Iterable cycle(Iterable)
    T getOnlyElement(Iterable<T>)
    Iterable<T> reverse(List<T>)
    

    有人能帮我理解这句话的意思吗?比如说我收集了 Persons 我应用一个过滤器只返回姓doe的人。

    这是否意味着“筛选只在对doOnly.next()的第一个调用上发生?”

    List<Person> persons= ....
    Iterable doeOnly= Iterables.filter(persons,DOE_AS_LAST_NAME_PREDICATE);
    
    1 回复  |  直到 9 年前
        1
  •  29
  •   Jon Skeet    15 年前

    这意味着数据会根据您的请求进行过滤——它不会立即通过您的列表,并建立一个新的过滤数据列表。相反,当你打电话的时候 iterator.next() (例如,自动在增强的for循环中)迭代器将向其上游数据源(您的集合)请求下一个数据项。然后,它将尝试将其与过滤器匹配。如果匹配,它将返回该项目。否则,它将从集合中请求另一个项目,一直进行,直到项目用完或找到匹配项为止。

    然后当你 下一个 要求下一个项目,它将继续从它停止的地方。

    换句话说,它不仅仅意味着“过滤只在第一次调用 doeOnly.next() “-表示”过滤发生在 每个 呼叫 nter() “哪里 iterator 是呼叫的结果 doeOnly.iterator() .