Home | History | Annotate | Download | only in collect
      1 /*
      2  * Copyright (C) 2007 The Guava Authors
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  * http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.google.common.collect;
     18 
     19 import static com.google.common.base.Preconditions.checkArgument;
     20 import static com.google.common.base.Preconditions.checkNotNull;
     21 import static com.google.common.base.Preconditions.checkState;
     22 import static com.google.common.base.Predicates.equalTo;
     23 import static com.google.common.base.Predicates.in;
     24 import static com.google.common.base.Predicates.not;
     25 import static com.google.common.collect.CollectPreconditions.checkRemove;
     26 
     27 import com.google.common.annotations.Beta;
     28 import com.google.common.annotations.GwtCompatible;
     29 import com.google.common.base.Function;
     30 import com.google.common.base.Objects;
     31 import com.google.common.base.Optional;
     32 import com.google.common.base.Preconditions;
     33 import com.google.common.base.Predicate;
     34 
     35 import java.util.Arrays;
     36 import java.util.Collection;
     37 import java.util.Collections;
     38 import java.util.Comparator;
     39 import java.util.Enumeration;
     40 import java.util.Iterator;
     41 import java.util.List;
     42 import java.util.ListIterator;
     43 import java.util.NoSuchElementException;
     44 import java.util.PriorityQueue;
     45 import java.util.Queue;
     46 
     47 import javax.annotation.Nullable;
     48 
     49 /**
     50  * This class contains static utility methods that operate on or return objects
     51  * of type {@link Iterator}. Except as noted, each method has a corresponding
     52  * {@link Iterable}-based method in the {@link Iterables} class.
     53  *
     54  * <p><i>Performance notes:</i> Unless otherwise noted, all of the iterators
     55  * produced in this class are <i>lazy</i>, which means that they only advance
     56  * the backing iteration when absolutely necessary.
     57  *
     58  * <p>See the Guava User Guide section on <a href=
     59  * "http://code.google.com/p/guava-libraries/wiki/CollectionUtilitiesExplained#Iterables">
     60  * {@code Iterators}</a>.
     61  *
     62  * @author Kevin Bourrillion
     63  * @author Jared Levy
     64  * @since 2.0 (imported from Google Collections Library)
     65  */
     66 @GwtCompatible(emulated = true)
     67 public final class Iterators {
     68   private Iterators() {}
     69 
     70   static final UnmodifiableListIterator<Object> EMPTY_LIST_ITERATOR
     71       = new UnmodifiableListIterator<Object>() {
     72         @Override
     73         public boolean hasNext() {
     74           return false;
     75         }
     76         @Override
     77         public Object next() {
     78           throw new NoSuchElementException();
     79         }
     80         @Override
     81         public boolean hasPrevious() {
     82           return false;
     83         }
     84         @Override
     85         public Object previous() {
     86           throw new NoSuchElementException();
     87         }
     88         @Override
     89         public int nextIndex() {
     90           return 0;
     91         }
     92         @Override
     93         public int previousIndex() {
     94           return -1;
     95         }
     96       };
     97 
     98   /**
     99    * Returns the empty iterator.
    100    *
    101    * <p>The {@link Iterable} equivalent of this method is {@link
    102    * ImmutableSet#of()}.
    103    *
    104    * @deprecated Use {@code ImmutableSet.<T>of().iterator()} instead; or for
    105    *     Java 7 or later, {@link Collections#emptyIterator}. This method is
    106    *     scheduled for removal in May 2016.
    107    */
    108   @Deprecated
    109   public static <T> UnmodifiableIterator<T> emptyIterator() {
    110     return emptyListIterator();
    111   }
    112 
    113   /**
    114    * Returns the empty iterator.
    115    *
    116    * <p>The {@link Iterable} equivalent of this method is {@link
    117    * ImmutableSet#of()}.
    118    */
    119   // Casting to any type is safe since there are no actual elements.
    120   @SuppressWarnings("unchecked")
    121   static <T> UnmodifiableListIterator<T> emptyListIterator() {
    122     return (UnmodifiableListIterator<T>) EMPTY_LIST_ITERATOR;
    123   }
    124 
    125   private static final Iterator<Object> EMPTY_MODIFIABLE_ITERATOR =
    126       new Iterator<Object>() {
    127         @Override public boolean hasNext() {
    128           return false;
    129         }
    130 
    131         @Override public Object next() {
    132           throw new NoSuchElementException();
    133         }
    134 
    135         @Override public void remove() {
    136           checkRemove(false);
    137         }
    138       };
    139 
    140   /**
    141    * Returns the empty {@code Iterator} that throws
    142    * {@link IllegalStateException} instead of
    143    * {@link UnsupportedOperationException} on a call to
    144    * {@link Iterator#remove()}.
    145    */
    146   // Casting to any type is safe since there are no actual elements.
    147   @SuppressWarnings("unchecked")
    148   static <T> Iterator<T> emptyModifiableIterator() {
    149     return (Iterator<T>) EMPTY_MODIFIABLE_ITERATOR;
    150   }
    151 
    152   /** Returns an unmodifiable view of {@code iterator}. */
    153   public static <T> UnmodifiableIterator<T> unmodifiableIterator(
    154       final Iterator<T> iterator) {
    155     checkNotNull(iterator);
    156     if (iterator instanceof UnmodifiableIterator) {
    157       return (UnmodifiableIterator<T>) iterator;
    158     }
    159     return new UnmodifiableIterator<T>() {
    160       @Override
    161       public boolean hasNext() {
    162         return iterator.hasNext();
    163       }
    164       @Override
    165       public T next() {
    166         return iterator.next();
    167       }
    168     };
    169   }
    170 
    171   /**
    172    * Simply returns its argument.
    173    *
    174    * @deprecated no need to use this
    175    * @since 10.0
    176    */
    177   @Deprecated public static <T> UnmodifiableIterator<T> unmodifiableIterator(
    178       UnmodifiableIterator<T> iterator) {
    179     return checkNotNull(iterator);
    180   }
    181 
    182   /**
    183    * Returns the number of elements remaining in {@code iterator}. The iterator
    184    * will be left exhausted: its {@code hasNext()} method will return
    185    * {@code false}.
    186    */
    187   public static int size(Iterator<?> iterator) {
    188     int count = 0;
    189     while (iterator.hasNext()) {
    190       iterator.next();
    191       count++;
    192     }
    193     return count;
    194   }
    195 
    196   /**
    197    * Returns {@code true} if {@code iterator} contains {@code element}.
    198    */
    199   public static boolean contains(Iterator<?> iterator, @Nullable Object element) {
    200     return any(iterator, equalTo(element));
    201   }
    202 
    203   /**
    204    * Traverses an iterator and removes every element that belongs to the
    205    * provided collection. The iterator will be left exhausted: its
    206    * {@code hasNext()} method will return {@code false}.
    207    *
    208    * @param removeFrom the iterator to (potentially) remove elements from
    209    * @param elementsToRemove the elements to remove
    210    * @return {@code true} if any element was removed from {@code iterator}
    211    */
    212   public static boolean removeAll(
    213       Iterator<?> removeFrom, Collection<?> elementsToRemove) {
    214     return removeIf(removeFrom, in(elementsToRemove));
    215   }
    216 
    217   /**
    218    * Removes every element that satisfies the provided predicate from the
    219    * iterator. The iterator will be left exhausted: its {@code hasNext()}
    220    * method will return {@code false}.
    221    *
    222    * @param removeFrom the iterator to (potentially) remove elements from
    223    * @param predicate a predicate that determines whether an element should
    224    *     be removed
    225    * @return {@code true} if any elements were removed from the iterator
    226    * @since 2.0
    227    */
    228   public static <T> boolean removeIf(
    229       Iterator<T> removeFrom, Predicate<? super T> predicate) {
    230     checkNotNull(predicate);
    231     boolean modified = false;
    232     while (removeFrom.hasNext()) {
    233       if (predicate.apply(removeFrom.next())) {
    234         removeFrom.remove();
    235         modified = true;
    236       }
    237     }
    238     return modified;
    239   }
    240 
    241   /**
    242    * Traverses an iterator and removes every element that does not belong to the
    243    * provided collection. The iterator will be left exhausted: its
    244    * {@code hasNext()} method will return {@code false}.
    245    *
    246    * @param removeFrom the iterator to (potentially) remove elements from
    247    * @param elementsToRetain the elements to retain
    248    * @return {@code true} if any element was removed from {@code iterator}
    249    */
    250   public static boolean retainAll(
    251       Iterator<?> removeFrom, Collection<?> elementsToRetain) {
    252     return removeIf(removeFrom, not(in(elementsToRetain)));
    253   }
    254 
    255   /**
    256    * Determines whether two iterators contain equal elements in the same order.
    257    * More specifically, this method returns {@code true} if {@code iterator1}
    258    * and {@code iterator2} contain the same number of elements and every element
    259    * of {@code iterator1} is equal to the corresponding element of
    260    * {@code iterator2}.
    261    *
    262    * <p>Note that this will modify the supplied iterators, since they will have
    263    * been advanced some number of elements forward.
    264    */
    265   public static boolean elementsEqual(
    266       Iterator<?> iterator1, Iterator<?> iterator2) {
    267     while (iterator1.hasNext()) {
    268       if (!iterator2.hasNext()) {
    269         return false;
    270       }
    271       Object o1 = iterator1.next();
    272       Object o2 = iterator2.next();
    273       if (!Objects.equal(o1, o2)) {
    274         return false;
    275       }
    276     }
    277     return !iterator2.hasNext();
    278   }
    279 
    280   /**
    281    * Returns a string representation of {@code iterator}, with the format
    282    * {@code [e1, e2, ..., en]}. The iterator will be left exhausted: its
    283    * {@code hasNext()} method will return {@code false}.
    284    */
    285   public static String toString(Iterator<?> iterator) {
    286     return Collections2.STANDARD_JOINER
    287         .appendTo(new StringBuilder().append('['), iterator)
    288         .append(']')
    289         .toString();
    290   }
    291 
    292   /**
    293    * Returns the single element contained in {@code iterator}.
    294    *
    295    * @throws NoSuchElementException if the iterator is empty
    296    * @throws IllegalArgumentException if the iterator contains multiple
    297    *     elements.  The state of the iterator is unspecified.
    298    */
    299   public static <T> T getOnlyElement(Iterator<T> iterator) {
    300     T first = iterator.next();
    301     if (!iterator.hasNext()) {
    302       return first;
    303     }
    304 
    305     StringBuilder sb = new StringBuilder();
    306     sb.append("expected one element but was: <" + first);
    307     for (int i = 0; i < 4 && iterator.hasNext(); i++) {
    308       sb.append(", " + iterator.next());
    309     }
    310     if (iterator.hasNext()) {
    311       sb.append(", ...");
    312     }
    313     sb.append('>');
    314 
    315     throw new IllegalArgumentException(sb.toString());
    316   }
    317 
    318   /**
    319    * Returns the single element contained in {@code iterator}, or {@code
    320    * defaultValue} if the iterator is empty.
    321    *
    322    * @throws IllegalArgumentException if the iterator contains multiple
    323    *     elements.  The state of the iterator is unspecified.
    324    */
    325   @Nullable
    326   public static <T> T getOnlyElement(Iterator<? extends T> iterator, @Nullable T defaultValue) {
    327     return iterator.hasNext() ? getOnlyElement(iterator) : defaultValue;
    328   }
    329 
    330   /**
    331    * Adds all elements in {@code iterator} to {@code collection}. The iterator
    332    * will be left exhausted: its {@code hasNext()} method will return
    333    * {@code false}.
    334    *
    335    * @return {@code true} if {@code collection} was modified as a result of this
    336    *         operation
    337    */
    338   public static <T> boolean addAll(
    339       Collection<T> addTo, Iterator<? extends T> iterator) {
    340     checkNotNull(addTo);
    341     checkNotNull(iterator);
    342     boolean wasModified = false;
    343     while (iterator.hasNext()) {
    344       wasModified |= addTo.add(iterator.next());
    345     }
    346     return wasModified;
    347   }
    348 
    349   /**
    350    * Returns the number of elements in the specified iterator that equal the
    351    * specified object. The iterator will be left exhausted: its
    352    * {@code hasNext()} method will return {@code false}.
    353    *
    354    * @see Collections#frequency
    355    */
    356   public static int frequency(Iterator<?> iterator, @Nullable Object element) {
    357     return size(filter(iterator, equalTo(element)));
    358   }
    359 
    360   /**
    361    * Returns an iterator that cycles indefinitely over the elements of {@code
    362    * iterable}.
    363    *
    364    * <p>The returned iterator supports {@code remove()} if the provided iterator
    365    * does. After {@code remove()} is called, subsequent cycles omit the removed
    366    * element, which is no longer in {@code iterable}. The iterator's
    367    * {@code hasNext()} method returns {@code true} until {@code iterable} is
    368    * empty.
    369    *
    370    * <p><b>Warning:</b> Typical uses of the resulting iterator may produce an
    371    * infinite loop. You should use an explicit {@code break} or be certain that
    372    * you will eventually remove all the elements.
    373    */
    374   public static <T> Iterator<T> cycle(final Iterable<T> iterable) {
    375     checkNotNull(iterable);
    376     return new Iterator<T>() {
    377       Iterator<T> iterator = emptyIterator();
    378       Iterator<T> removeFrom;
    379 
    380       @Override
    381       public boolean hasNext() {
    382         if (!iterator.hasNext()) {
    383           iterator = iterable.iterator();
    384         }
    385         return iterator.hasNext();
    386       }
    387       @Override
    388       public T next() {
    389         if (!hasNext()) {
    390           throw new NoSuchElementException();
    391         }
    392         removeFrom = iterator;
    393         return iterator.next();
    394       }
    395       @Override
    396       public void remove() {
    397         checkRemove(removeFrom != null);
    398         removeFrom.remove();
    399         removeFrom = null;
    400       }
    401     };
    402   }
    403 
    404   /**
    405    * Returns an iterator that cycles indefinitely over the provided elements.
    406    *
    407    * <p>The returned iterator supports {@code remove()}. After {@code remove()}
    408    * is called, subsequent cycles omit the removed
    409    * element, but {@code elements} does not change. The iterator's
    410    * {@code hasNext()} method returns {@code true} until all of the original
    411    * elements have been removed.
    412    *
    413    * <p><b>Warning:</b> Typical uses of the resulting iterator may produce an
    414    * infinite loop. You should use an explicit {@code break} or be certain that
    415    * you will eventually remove all the elements.
    416    */
    417   public static <T> Iterator<T> cycle(T... elements) {
    418     return cycle(Lists.newArrayList(elements));
    419   }
    420 
    421   /**
    422    * Combines two iterators into a single iterator. The returned iterator
    423    * iterates across the elements in {@code a}, followed by the elements in
    424    * {@code b}. The source iterators are not polled until necessary.
    425    *
    426    * <p>The returned iterator supports {@code remove()} when the corresponding
    427    * input iterator supports it.
    428    *
    429    * <p><b>Note:</b> the current implementation is not suitable for nested
    430    * concatenated iterators, i.e. the following should be avoided when in a loop:
    431    * {@code iterator = Iterators.concat(iterator, suffix);}, since iteration over the
    432    * resulting iterator has a cubic complexity to the depth of the nesting.
    433    */
    434   public static <T> Iterator<T> concat(Iterator<? extends T> a,
    435       Iterator<? extends T> b) {
    436     return concat(ImmutableList.of(a, b).iterator());
    437   }
    438 
    439   /**
    440    * Combines three iterators into a single iterator. The returned iterator
    441    * iterates across the elements in {@code a}, followed by the elements in
    442    * {@code b}, followed by the elements in {@code c}. The source iterators
    443    * are not polled until necessary.
    444    *
    445    * <p>The returned iterator supports {@code remove()} when the corresponding
    446    * input iterator supports it.
    447    *
    448    * <p><b>Note:</b> the current implementation is not suitable for nested
    449    * concatenated iterators, i.e. the following should be avoided when in a loop:
    450    * {@code iterator = Iterators.concat(iterator, suffix);}, since iteration over the
    451    * resulting iterator has a cubic complexity to the depth of the nesting.
    452    */
    453   public static <T> Iterator<T> concat(Iterator<? extends T> a,
    454       Iterator<? extends T> b, Iterator<? extends T> c) {
    455     return concat(ImmutableList.of(a, b, c).iterator());
    456   }
    457 
    458   /**
    459    * Combines four iterators into a single iterator. The returned iterator
    460    * iterates across the elements in {@code a}, followed by the elements in
    461    * {@code b}, followed by the elements in {@code c}, followed by the elements
    462    * in {@code d}. The source iterators are not polled until necessary.
    463    *
    464    * <p>The returned iterator supports {@code remove()} when the corresponding
    465    * input iterator supports it.
    466    *
    467    * <p><b>Note:</b> the current implementation is not suitable for nested
    468    * concatenated iterators, i.e. the following should be avoided when in a loop:
    469    * {@code iterator = Iterators.concat(iterator, suffix);}, since iteration over the
    470    * resulting iterator has a cubic complexity to the depth of the nesting.
    471    */
    472   public static <T> Iterator<T> concat(Iterator<? extends T> a,
    473       Iterator<? extends T> b, Iterator<? extends T> c,
    474       Iterator<? extends T> d) {
    475     return concat(ImmutableList.of(a, b, c, d).iterator());
    476   }
    477 
    478   /**
    479    * Combines multiple iterators into a single iterator. The returned iterator
    480    * iterates across the elements of each iterator in {@code inputs}. The input
    481    * iterators are not polled until necessary.
    482    *
    483    * <p>The returned iterator supports {@code remove()} when the corresponding
    484    * input iterator supports it.
    485    *
    486    * <p><b>Note:</b> the current implementation is not suitable for nested
    487    * concatenated iterators, i.e. the following should be avoided when in a loop:
    488    * {@code iterator = Iterators.concat(iterator, suffix);}, since iteration over the
    489    * resulting iterator has a cubic complexity to the depth of the nesting.
    490    *
    491    * @throws NullPointerException if any of the provided iterators is null
    492    */
    493   public static <T> Iterator<T> concat(Iterator<? extends T>... inputs) {
    494     return concat(ImmutableList.copyOf(inputs).iterator());
    495   }
    496 
    497   /**
    498    * Combines multiple iterators into a single iterator. The returned iterator
    499    * iterates across the elements of each iterator in {@code inputs}. The input
    500    * iterators are not polled until necessary.
    501    *
    502    * <p>The returned iterator supports {@code remove()} when the corresponding
    503    * input iterator supports it. The methods of the returned iterator may throw
    504    * {@code NullPointerException} if any of the input iterators is null.
    505    *
    506    * <p><b>Note:</b> the current implementation is not suitable for nested
    507    * concatenated iterators, i.e. the following should be avoided when in a loop:
    508    * {@code iterator = Iterators.concat(iterator, suffix);}, since iteration over the
    509    * resulting iterator has a cubic complexity to the depth of the nesting.
    510    */
    511   public static <T> Iterator<T> concat(
    512       final Iterator<? extends Iterator<? extends T>> inputs) {
    513     checkNotNull(inputs);
    514     return new Iterator<T>() {
    515       Iterator<? extends T> current = emptyIterator();
    516       Iterator<? extends T> removeFrom;
    517 
    518       @Override
    519       public boolean hasNext() {
    520         // http://code.google.com/p/google-collections/issues/detail?id=151
    521         // current.hasNext() might be relatively expensive, worth minimizing.
    522         boolean currentHasNext;
    523         // checkNotNull eager for GWT
    524         // note: it must be here & not where 'current' is assigned,
    525         // because otherwise we'll have called inputs.next() before throwing
    526         // the first NPE, and the next time around we'll call inputs.next()
    527         // again, incorrectly moving beyond the error.
    528         while (!(currentHasNext = checkNotNull(current).hasNext())
    529             && inputs.hasNext()) {
    530           current = inputs.next();
    531         }
    532         return currentHasNext;
    533       }
    534       @Override
    535       public T next() {
    536         if (!hasNext()) {
    537           throw new NoSuchElementException();
    538         }
    539         removeFrom = current;
    540         return current.next();
    541       }
    542       @Override
    543       public void remove() {
    544         checkRemove(removeFrom != null);
    545         removeFrom.remove();
    546         removeFrom = null;
    547       }
    548     };
    549   }
    550 
    551   /**
    552    * Divides an iterator into unmodifiable sublists of the given size (the final
    553    * list may be smaller). For example, partitioning an iterator containing
    554    * {@code [a, b, c, d, e]} with a partition size of 3 yields {@code
    555    * [[a, b, c], [d, e]]} -- an outer iterator containing two inner lists of
    556    * three and two elements, all in the original order.
    557    *
    558    * <p>The returned lists implement {@link java.util.RandomAccess}.
    559    *
    560    * @param iterator the iterator to return a partitioned view of
    561    * @param size the desired size of each partition (the last may be smaller)
    562    * @return an iterator of immutable lists containing the elements of {@code
    563    *     iterator} divided into partitions
    564    * @throws IllegalArgumentException if {@code size} is nonpositive
    565    */
    566   public static <T> UnmodifiableIterator<List<T>> partition(
    567       Iterator<T> iterator, int size) {
    568     return partitionImpl(iterator, size, false);
    569   }
    570 
    571   /**
    572    * Divides an iterator into unmodifiable sublists of the given size, padding
    573    * the final iterator with null values if necessary. For example, partitioning
    574    * an iterator containing {@code [a, b, c, d, e]} with a partition size of 3
    575    * yields {@code [[a, b, c], [d, e, null]]} -- an outer iterator containing
    576    * two inner lists of three elements each, all in the original order.
    577    *
    578    * <p>The returned lists implement {@link java.util.RandomAccess}.
    579    *
    580    * @param iterator the iterator to return a partitioned view of
    581    * @param size the desired size of each partition
    582    * @return an iterator of immutable lists containing the elements of {@code
    583    *     iterator} divided into partitions (the final iterable may have
    584    *     trailing null elements)
    585    * @throws IllegalArgumentException if {@code size} is nonpositive
    586    */
    587   public static <T> UnmodifiableIterator<List<T>> paddedPartition(
    588       Iterator<T> iterator, int size) {
    589     return partitionImpl(iterator, size, true);
    590   }
    591 
    592   private static <T> UnmodifiableIterator<List<T>> partitionImpl(
    593       final Iterator<T> iterator, final int size, final boolean pad) {
    594     checkNotNull(iterator);
    595     checkArgument(size > 0);
    596     return new UnmodifiableIterator<List<T>>() {
    597       @Override
    598       public boolean hasNext() {
    599         return iterator.hasNext();
    600       }
    601       @Override
    602       public List<T> next() {
    603         if (!hasNext()) {
    604           throw new NoSuchElementException();
    605         }
    606         Object[] array = new Object[size];
    607         int count = 0;
    608         for (; count < size && iterator.hasNext(); count++) {
    609           array[count] = iterator.next();
    610         }
    611         for (int i = count; i < size; i++) {
    612           array[i] = null; // for GWT
    613         }
    614 
    615         @SuppressWarnings("unchecked") // we only put Ts in it
    616         List<T> list = Collections.unmodifiableList(
    617             (List<T>) Arrays.asList(array));
    618         return (pad || count == size) ? list : list.subList(0, count);
    619       }
    620     };
    621   }
    622 
    623   /**
    624    * Returns the elements of {@code unfiltered} that satisfy a predicate.
    625    */
    626   public static <T> UnmodifiableIterator<T> filter(
    627       final Iterator<T> unfiltered, final Predicate<? super T> predicate) {
    628     checkNotNull(unfiltered);
    629     checkNotNull(predicate);
    630     return new AbstractIterator<T>() {
    631       @Override protected T computeNext() {
    632         while (unfiltered.hasNext()) {
    633           T element = unfiltered.next();
    634           if (predicate.apply(element)) {
    635             return element;
    636           }
    637         }
    638         return endOfData();
    639       }
    640     };
    641   }
    642 
    643   /**
    644    * Returns {@code true} if one or more elements returned by {@code iterator}
    645    * satisfy the given predicate.
    646    */
    647   public static <T> boolean any(
    648       Iterator<T> iterator, Predicate<? super T> predicate) {
    649     return indexOf(iterator, predicate) != -1;
    650   }
    651 
    652   /**
    653    * Returns {@code true} if every element returned by {@code iterator}
    654    * satisfies the given predicate. If {@code iterator} is empty, {@code true}
    655    * is returned.
    656    */
    657   public static <T> boolean all(
    658       Iterator<T> iterator, Predicate<? super T> predicate) {
    659     checkNotNull(predicate);
    660     while (iterator.hasNext()) {
    661       T element = iterator.next();
    662       if (!predicate.apply(element)) {
    663         return false;
    664       }
    665     }
    666     return true;
    667   }
    668 
    669   /**
    670    * Returns the first element in {@code iterator} that satisfies the given
    671    * predicate; use this method only when such an element is known to exist. If
    672    * no such element is found, the iterator will be left exhausted: its {@code
    673    * hasNext()} method will return {@code false}. If it is possible that
    674    * <i>no</i> element will match, use {@link #tryFind} or {@link
    675    * #find(Iterator, Predicate, Object)} instead.
    676    *
    677    * @throws NoSuchElementException if no element in {@code iterator} matches
    678    *     the given predicate
    679    */
    680   public static <T> T find(
    681       Iterator<T> iterator, Predicate<? super T> predicate) {
    682     return filter(iterator, predicate).next();
    683   }
    684 
    685   /**
    686    * Returns the first element in {@code iterator} that satisfies the given
    687    * predicate. If no such element is found, {@code defaultValue} will be
    688    * returned from this method and the iterator will be left exhausted: its
    689    * {@code hasNext()} method will return {@code false}. Note that this can
    690    * usually be handled more naturally using {@code
    691    * tryFind(iterator, predicate).or(defaultValue)}.
    692    *
    693    * @since 7.0
    694    */
    695   @Nullable
    696   public static <T> T find(Iterator<? extends T> iterator, Predicate<? super T> predicate,
    697       @Nullable T defaultValue) {
    698     return getNext(filter(iterator, predicate), defaultValue);
    699   }
    700 
    701   /**
    702    * Returns an {@link Optional} containing the first element in {@code
    703    * iterator} that satisfies the given predicate, if such an element exists. If
    704    * no such element is found, an empty {@link Optional} will be returned from
    705    * this method and the iterator will be left exhausted: its {@code
    706    * hasNext()} method will return {@code false}.
    707    *
    708    * <p><b>Warning:</b> avoid using a {@code predicate} that matches {@code
    709    * null}. If {@code null} is matched in {@code iterator}, a
    710    * NullPointerException will be thrown.
    711    *
    712    * @since 11.0
    713    */
    714   public static <T> Optional<T> tryFind(
    715       Iterator<T> iterator, Predicate<? super T> predicate) {
    716     UnmodifiableIterator<T> filteredIterator = filter(iterator, predicate);
    717     return filteredIterator.hasNext()
    718         ? Optional.of(filteredIterator.next())
    719         : Optional.<T>absent();
    720   }
    721 
    722   /**
    723    * Returns the index in {@code iterator} of the first element that satisfies
    724    * the provided {@code predicate}, or {@code -1} if the Iterator has no such
    725    * elements.
    726    *
    727    * <p>More formally, returns the lowest index {@code i} such that
    728    * {@code predicate.apply(Iterators.get(iterator, i))} returns {@code true},
    729    * or {@code -1} if there is no such index.
    730    *
    731    * <p>If -1 is returned, the iterator will be left exhausted: its
    732    * {@code hasNext()} method will return {@code false}.  Otherwise,
    733    * the iterator will be set to the element which satisfies the
    734    * {@code predicate}.
    735    *
    736    * @since 2.0
    737    */
    738   public static <T> int indexOf(
    739       Iterator<T> iterator, Predicate<? super T> predicate) {
    740     checkNotNull(predicate, "predicate");
    741     for (int i = 0; iterator.hasNext(); i++) {
    742       T current = iterator.next();
    743       if (predicate.apply(current)) {
    744         return i;
    745       }
    746     }
    747     return -1;
    748   }
    749 
    750   /**
    751    * Returns an iterator that applies {@code function} to each element of {@code
    752    * fromIterator}.
    753    *
    754    * <p>The returned iterator supports {@code remove()} if the provided iterator
    755    * does. After a successful {@code remove()} call, {@code fromIterator} no
    756    * longer contains the corresponding element.
    757    */
    758   public static <F, T> Iterator<T> transform(final Iterator<F> fromIterator,
    759       final Function<? super F, ? extends T> function) {
    760     checkNotNull(function);
    761     return new TransformedIterator<F, T>(fromIterator) {
    762       @Override
    763       T transform(F from) {
    764         return function.apply(from);
    765       }
    766     };
    767   }
    768 
    769   /**
    770    * Advances {@code iterator} {@code position + 1} times, returning the
    771    * element at the {@code position}th position.
    772    *
    773    * @param position position of the element to return
    774    * @return the element at the specified position in {@code iterator}
    775    * @throws IndexOutOfBoundsException if {@code position} is negative or
    776    *     greater than or equal to the number of elements remaining in
    777    *     {@code iterator}
    778    */
    779   public static <T> T get(Iterator<T> iterator, int position) {
    780     checkNonnegative(position);
    781     int skipped = advance(iterator, position);
    782     if (!iterator.hasNext()) {
    783       throw new IndexOutOfBoundsException("position (" + position
    784           + ") must be less than the number of elements that remained ("
    785           + skipped + ")");
    786     }
    787     return iterator.next();
    788   }
    789 
    790   static void checkNonnegative(int position) {
    791     if (position < 0) {
    792       throw new IndexOutOfBoundsException("position (" + position
    793           + ") must not be negative");
    794     }
    795   }
    796 
    797   /**
    798    * Advances {@code iterator} {@code position + 1} times, returning the
    799    * element at the {@code position}th position or {@code defaultValue}
    800    * otherwise.
    801    *
    802    * @param position position of the element to return
    803    * @param defaultValue the default value to return if the iterator is empty
    804    *     or if {@code position} is greater than the number of elements
    805    *     remaining in {@code iterator}
    806    * @return the element at the specified position in {@code iterator} or
    807    *     {@code defaultValue} if {@code iterator} produces fewer than
    808    *     {@code position + 1} elements.
    809    * @throws IndexOutOfBoundsException if {@code position} is negative
    810    * @since 4.0
    811    */
    812   @Nullable
    813   public static <T> T get(Iterator<? extends T> iterator, int position, @Nullable T defaultValue) {
    814     checkNonnegative(position);
    815     advance(iterator, position);
    816     return getNext(iterator, defaultValue);
    817   }
    818 
    819   /**
    820    * Returns the next element in {@code iterator} or {@code defaultValue} if
    821    * the iterator is empty.  The {@link Iterables} analog to this method is
    822    * {@link Iterables#getFirst}.
    823    *
    824    * @param defaultValue the default value to return if the iterator is empty
    825    * @return the next element of {@code iterator} or the default value
    826    * @since 7.0
    827    */
    828   @Nullable
    829   public static <T> T getNext(Iterator<? extends T> iterator, @Nullable T defaultValue) {
    830     return iterator.hasNext() ? iterator.next() : defaultValue;
    831   }
    832 
    833   /**
    834    * Advances {@code iterator} to the end, returning the last element.
    835    *
    836    * @return the last element of {@code iterator}
    837    * @throws NoSuchElementException if the iterator is empty
    838    */
    839   public static <T> T getLast(Iterator<T> iterator) {
    840     while (true) {
    841       T current = iterator.next();
    842       if (!iterator.hasNext()) {
    843         return current;
    844       }
    845     }
    846   }
    847 
    848   /**
    849    * Advances {@code iterator} to the end, returning the last element or
    850    * {@code defaultValue} if the iterator is empty.
    851    *
    852    * @param defaultValue the default value to return if the iterator is empty
    853    * @return the last element of {@code iterator}
    854    * @since 3.0
    855    */
    856   @Nullable
    857   public static <T> T getLast(Iterator<? extends T> iterator, @Nullable T defaultValue) {
    858     return iterator.hasNext() ? getLast(iterator) : defaultValue;
    859   }
    860 
    861   /**
    862    * Calls {@code next()} on {@code iterator}, either {@code numberToAdvance} times
    863    * or until {@code hasNext()} returns {@code false}, whichever comes first.
    864    *
    865    * @return the number of elements the iterator was advanced
    866    * @since 13.0 (since 3.0 as {@code Iterators.skip})
    867    */
    868   public static int advance(Iterator<?> iterator, int numberToAdvance) {
    869     checkNotNull(iterator);
    870     checkArgument(numberToAdvance >= 0, "numberToAdvance must be nonnegative");
    871 
    872     int i;
    873     for (i = 0; i < numberToAdvance && iterator.hasNext(); i++) {
    874       iterator.next();
    875     }
    876     return i;
    877   }
    878 
    879   /**
    880    * Creates an iterator returning the first {@code limitSize} elements of the
    881    * given iterator. If the original iterator does not contain that many
    882    * elements, the returned iterator will have the same behavior as the original
    883    * iterator. The returned iterator supports {@code remove()} if the original
    884    * iterator does.
    885    *
    886    * @param iterator the iterator to limit
    887    * @param limitSize the maximum number of elements in the returned iterator
    888    * @throws IllegalArgumentException if {@code limitSize} is negative
    889    * @since 3.0
    890    */
    891   public static <T> Iterator<T> limit(
    892       final Iterator<T> iterator, final int limitSize) {
    893     checkNotNull(iterator);
    894     checkArgument(limitSize >= 0, "limit is negative");
    895     return new Iterator<T>() {
    896       private int count;
    897 
    898       @Override
    899       public boolean hasNext() {
    900         return count < limitSize && iterator.hasNext();
    901       }
    902 
    903       @Override
    904       public T next() {
    905         if (!hasNext()) {
    906           throw new NoSuchElementException();
    907         }
    908         count++;
    909         return iterator.next();
    910       }
    911 
    912       @Override
    913       public void remove() {
    914         iterator.remove();
    915       }
    916     };
    917   }
    918 
    919   /**
    920    * Returns a view of the supplied {@code iterator} that removes each element
    921    * from the supplied {@code iterator} as it is returned.
    922    *
    923    * <p>The provided iterator must support {@link Iterator#remove()} or
    924    * else the returned iterator will fail on the first call to {@code
    925    * next}.
    926    *
    927    * @param iterator the iterator to remove and return elements from
    928    * @return an iterator that removes and returns elements from the
    929    *     supplied iterator
    930    * @since 2.0
    931    */
    932   public static <T> Iterator<T> consumingIterator(final Iterator<T> iterator) {
    933     checkNotNull(iterator);
    934     return new UnmodifiableIterator<T>() {
    935       @Override
    936       public boolean hasNext() {
    937         return iterator.hasNext();
    938       }
    939 
    940       @Override
    941       public T next() {
    942         T next = iterator.next();
    943         iterator.remove();
    944         return next;
    945       }
    946 
    947       @Override
    948       public String toString() {
    949         return "Iterators.consumingIterator(...)";
    950       }
    951     };
    952   }
    953 
    954   /**
    955    * Deletes and returns the next value from the iterator, or returns
    956    * {@code null} if there is no such value.
    957    */
    958   @Nullable
    959   static <T> T pollNext(Iterator<T> iterator) {
    960     if (iterator.hasNext()) {
    961       T result = iterator.next();
    962       iterator.remove();
    963       return result;
    964     } else {
    965       return null;
    966     }
    967   }
    968 
    969   // Methods only in Iterators, not in Iterables
    970 
    971   /**
    972    * Clears the iterator using its remove method.
    973    */
    974   static void clear(Iterator<?> iterator) {
    975     checkNotNull(iterator);
    976     while (iterator.hasNext()) {
    977       iterator.next();
    978       iterator.remove();
    979     }
    980   }
    981 
    982   /**
    983    * Returns an iterator containing the elements of {@code array} in order. The
    984    * returned iterator is a view of the array; subsequent changes to the array
    985    * will be reflected in the iterator.
    986    *
    987    * <p><b>Note:</b> It is often preferable to represent your data using a
    988    * collection type, for example using {@link Arrays#asList(Object[])}, making
    989    * this method unnecessary.
    990    *
    991    * <p>The {@code Iterable} equivalent of this method is either {@link
    992    * Arrays#asList(Object[])}, {@link ImmutableList#copyOf(Object[])}},
    993    * or {@link ImmutableList#of}.
    994    */
    995   public static <T> UnmodifiableIterator<T> forArray(final T... array) {
    996     return forArray(array, 0, array.length, 0);
    997   }
    998 
    999   /**
   1000    * Returns a list iterator containing the elements in the specified range of
   1001    * {@code array} in order, starting at the specified index.
   1002    *
   1003    * <p>The {@code Iterable} equivalent of this method is {@code
   1004    * Arrays.asList(array).subList(offset, offset + length).listIterator(index)}.
   1005    */
   1006   static <T> UnmodifiableListIterator<T> forArray(
   1007       final T[] array, final int offset, int length, int index) {
   1008     checkArgument(length >= 0);
   1009     int end = offset + length;
   1010 
   1011     // Technically we should give a slightly more descriptive error on overflow
   1012     Preconditions.checkPositionIndexes(offset, end, array.length);
   1013     Preconditions.checkPositionIndex(index, length);
   1014     if (length == 0) {
   1015       return emptyListIterator();
   1016     }
   1017 
   1018     /*
   1019      * We can't use call the two-arg constructor with arguments (offset, end)
   1020      * because the returned Iterator is a ListIterator that may be moved back
   1021      * past the beginning of the iteration.
   1022      */
   1023     return new AbstractIndexedListIterator<T>(length, index) {
   1024       @Override protected T get(int index) {
   1025         return array[offset + index];
   1026       }
   1027     };
   1028   }
   1029 
   1030   /**
   1031    * Returns an iterator containing only {@code value}.
   1032    *
   1033    * <p>The {@link Iterable} equivalent of this method is {@link
   1034    * Collections#singleton}.
   1035    */
   1036   public static <T> UnmodifiableIterator<T> singletonIterator(
   1037       @Nullable final T value) {
   1038     return new UnmodifiableIterator<T>() {
   1039       boolean done;
   1040       @Override
   1041       public boolean hasNext() {
   1042         return !done;
   1043       }
   1044       @Override
   1045       public T next() {
   1046         if (done) {
   1047           throw new NoSuchElementException();
   1048         }
   1049         done = true;
   1050         return value;
   1051       }
   1052     };
   1053   }
   1054 
   1055   /**
   1056    * Adapts an {@code Enumeration} to the {@code Iterator} interface.
   1057    *
   1058    * <p>This method has no equivalent in {@link Iterables} because viewing an
   1059    * {@code Enumeration} as an {@code Iterable} is impossible. However, the
   1060    * contents can be <i>copied</i> into a collection using {@link
   1061    * Collections#list}.
   1062    */
   1063   public static <T> UnmodifiableIterator<T> forEnumeration(
   1064       final Enumeration<T> enumeration) {
   1065     checkNotNull(enumeration);
   1066     return new UnmodifiableIterator<T>() {
   1067       @Override
   1068       public boolean hasNext() {
   1069         return enumeration.hasMoreElements();
   1070       }
   1071       @Override
   1072       public T next() {
   1073         return enumeration.nextElement();
   1074       }
   1075     };
   1076   }
   1077 
   1078   /**
   1079    * Adapts an {@code Iterator} to the {@code Enumeration} interface.
   1080    *
   1081    * <p>The {@code Iterable} equivalent of this method is either {@link
   1082    * Collections#enumeration} (if you have a {@link Collection}), or
   1083    * {@code Iterators.asEnumeration(collection.iterator())}.
   1084    */
   1085   public static <T> Enumeration<T> asEnumeration(final Iterator<T> iterator) {
   1086     checkNotNull(iterator);
   1087     return new Enumeration<T>() {
   1088       @Override
   1089       public boolean hasMoreElements() {
   1090         return iterator.hasNext();
   1091       }
   1092       @Override
   1093       public T nextElement() {
   1094         return iterator.next();
   1095       }
   1096     };
   1097   }
   1098 
   1099   /**
   1100    * Implementation of PeekingIterator that avoids peeking unless necessary.
   1101    */
   1102   private static class PeekingImpl<E> implements PeekingIterator<E> {
   1103 
   1104     private final Iterator<? extends E> iterator;
   1105     private boolean hasPeeked;
   1106     private E peekedElement;
   1107 
   1108     public PeekingImpl(Iterator<? extends E> iterator) {
   1109       this.iterator = checkNotNull(iterator);
   1110     }
   1111 
   1112     @Override
   1113     public boolean hasNext() {
   1114       return hasPeeked || iterator.hasNext();
   1115     }
   1116 
   1117     @Override
   1118     public E next() {
   1119       if (!hasPeeked) {
   1120         return iterator.next();
   1121       }
   1122       E result = peekedElement;
   1123       hasPeeked = false;
   1124       peekedElement = null;
   1125       return result;
   1126     }
   1127 
   1128     @Override
   1129     public void remove() {
   1130       checkState(!hasPeeked, "Can't remove after you've peeked at next");
   1131       iterator.remove();
   1132     }
   1133 
   1134     @Override
   1135     public E peek() {
   1136       if (!hasPeeked) {
   1137         peekedElement = iterator.next();
   1138         hasPeeked = true;
   1139       }
   1140       return peekedElement;
   1141     }
   1142   }
   1143 
   1144   /**
   1145    * Returns a {@code PeekingIterator} backed by the given iterator.
   1146    *
   1147    * <p>Calls to the {@code peek} method with no intervening calls to {@code
   1148    * next} do not affect the iteration, and hence return the same object each
   1149    * time. A subsequent call to {@code next} is guaranteed to return the same
   1150    * object again. For example: <pre>   {@code
   1151    *
   1152    *   PeekingIterator<String> peekingIterator =
   1153    *       Iterators.peekingIterator(Iterators.forArray("a", "b"));
   1154    *   String a1 = peekingIterator.peek(); // returns "a"
   1155    *   String a2 = peekingIterator.peek(); // also returns "a"
   1156    *   String a3 = peekingIterator.next(); // also returns "a"}</pre>
   1157    *
   1158    * <p>Any structural changes to the underlying iteration (aside from those
   1159    * performed by the iterator's own {@link PeekingIterator#remove()} method)
   1160    * will leave the iterator in an undefined state.
   1161    *
   1162    * <p>The returned iterator does not support removal after peeking, as
   1163    * explained by {@link PeekingIterator#remove()}.
   1164    *
   1165    * <p>Note: If the given iterator is already a {@code PeekingIterator},
   1166    * it <i>might</i> be returned to the caller, although this is neither
   1167    * guaranteed to occur nor required to be consistent.  For example, this
   1168    * method <i>might</i> choose to pass through recognized implementations of
   1169    * {@code PeekingIterator} when the behavior of the implementation is
   1170    * known to meet the contract guaranteed by this method.
   1171    *
   1172    * <p>There is no {@link Iterable} equivalent to this method, so use this
   1173    * method to wrap each individual iterator as it is generated.
   1174    *
   1175    * @param iterator the backing iterator. The {@link PeekingIterator} assumes
   1176    *     ownership of this iterator, so users should cease making direct calls
   1177    *     to it after calling this method.
   1178    * @return a peeking iterator backed by that iterator. Apart from the
   1179    *     additional {@link PeekingIterator#peek()} method, this iterator behaves
   1180    *     exactly the same as {@code iterator}.
   1181    */
   1182   public static <T> PeekingIterator<T> peekingIterator(
   1183       Iterator<? extends T> iterator) {
   1184     if (iterator instanceof PeekingImpl) {
   1185       // Safe to cast <? extends T> to <T> because PeekingImpl only uses T
   1186       // covariantly (and cannot be subclassed to add non-covariant uses).
   1187       @SuppressWarnings("unchecked")
   1188       PeekingImpl<T> peeking = (PeekingImpl<T>) iterator;
   1189       return peeking;
   1190     }
   1191     return new PeekingImpl<T>(iterator);
   1192   }
   1193 
   1194   /**
   1195    * Simply returns its argument.
   1196    *
   1197    * @deprecated no need to use this
   1198    * @since 10.0
   1199    */
   1200   @Deprecated public static <T> PeekingIterator<T> peekingIterator(
   1201       PeekingIterator<T> iterator) {
   1202     return checkNotNull(iterator);
   1203   }
   1204 
   1205   /**
   1206    * Returns an iterator over the merged contents of all given
   1207    * {@code iterators}, traversing every element of the input iterators.
   1208    * Equivalent entries will not be de-duplicated.
   1209    *
   1210    * <p>Callers must ensure that the source {@code iterators} are in
   1211    * non-descending order as this method does not sort its input.
   1212    *
   1213    * <p>For any equivalent elements across all {@code iterators}, it is
   1214    * undefined which element is returned first.
   1215    *
   1216    * @since 11.0
   1217    */
   1218   @Beta
   1219   public static <T> UnmodifiableIterator<T> mergeSorted(
   1220       Iterable<? extends Iterator<? extends T>> iterators,
   1221       Comparator<? super T> comparator) {
   1222     checkNotNull(iterators, "iterators");
   1223     checkNotNull(comparator, "comparator");
   1224 
   1225     return new MergingIterator<T>(iterators, comparator);
   1226   }
   1227 
   1228   /**
   1229    * An iterator that performs a lazy N-way merge, calculating the next value
   1230    * each time the iterator is polled. This amortizes the sorting cost over the
   1231    * iteration and requires less memory than sorting all elements at once.
   1232    *
   1233    * <p>Retrieving a single element takes approximately O(log(M)) time, where M
   1234    * is the number of iterators. (Retrieving all elements takes approximately
   1235    * O(N*log(M)) time, where N is the total number of elements.)
   1236    */
   1237   private static class MergingIterator<T> extends UnmodifiableIterator<T> {
   1238     final Queue<PeekingIterator<T>> queue;
   1239 
   1240     public MergingIterator(Iterable<? extends Iterator<? extends T>> iterators,
   1241         final Comparator<? super T> itemComparator) {
   1242       // A comparator that's used by the heap, allowing the heap
   1243       // to be sorted based on the top of each iterator.
   1244       Comparator<PeekingIterator<T>> heapComparator =
   1245           new Comparator<PeekingIterator<T>>() {
   1246             @Override
   1247             public int compare(PeekingIterator<T> o1, PeekingIterator<T> o2) {
   1248               return itemComparator.compare(o1.peek(), o2.peek());
   1249             }
   1250           };
   1251 
   1252       queue = new PriorityQueue<PeekingIterator<T>>(2, heapComparator);
   1253 
   1254       for (Iterator<? extends T> iterator : iterators) {
   1255         if (iterator.hasNext()) {
   1256           queue.add(Iterators.peekingIterator(iterator));
   1257         }
   1258       }
   1259     }
   1260 
   1261     @Override
   1262     public boolean hasNext() {
   1263       return !queue.isEmpty();
   1264     }
   1265 
   1266     @Override
   1267     public T next() {
   1268       PeekingIterator<T> nextIter = queue.remove();
   1269       T next = nextIter.next();
   1270       if (nextIter.hasNext()) {
   1271         queue.add(nextIter);
   1272       }
   1273       return next;
   1274     }
   1275   }
   1276 
   1277   /**
   1278    * Used to avoid http://bugs.sun.com/view_bug.do?bug_id=6558557
   1279    */
   1280   static <T> ListIterator<T> cast(Iterator<T> iterator) {
   1281     return (ListIterator<T>) iterator;
   1282   }
   1283 }
   1284