21

プレゼンテーションの 1 つは、「これらのメソッドは LAZY です!」と述べています。

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の人だけを返すとしましょう。

これは、「doeOnly.next() への最初の呼び出しでのみフィルタリングが行われる」ということですか?

List<Person> persons= ....
Iterable doeOnly= Iterables.filter(persons,DOE_AS_LAST_NAME_PREDICATE);
4

1 に答える 1

34

これは、要求に応じてデータがフィルター処理されることを意味します。データはすぐにリストを通過せず、フィルター処理されたデータの新しいリストを作成します。代わりに、呼び出すとiterator.next()(たとえば、拡張 for ループで自動的に)、イテレータは上流のデータ ソース (コレクション) に次のデータ項目を要求します。次に、これをフィルターと照合しようとします。一致する場合は、そのアイテムが返されます。それ以外の場合は、コレクションから別のアイテムを要求し、アイテムがなくなるか、一致するアイテムが見つかるまで処理を続けます。

次にのアイテムを要求すると、中断したところから続行します。

言い換えれば、「フィルタリングは への最初の呼び出しでのみ発生する」という意味ではなく、「への呼び出しのたびdoeOnly.next()にフィルタリングが行われる」ことを意味します。iterator.next()iteratordoeOnly.iterator()

于 2010-01-28T15:52:28.660 に答える