hg: lambda/lambda/jdk: Modify Iterables.uniqueElements to be fully lazy.

Rémi Forax forax at univ-mlv.fr
Fri Apr 13 16:12:28 PDT 2012


On 04/14/2012 12:23 AM, stuart.marks at oracle.com wrote:
> Changeset: 08c12c22393c
> Author:    smarks
> Date:      2012-04-13 15:24 -0700
> URL:       http://hg.openjdk.java.net/lambda/lambda/jdk/rev/08c12c22393c
>
> Modify Iterables.uniqueElements to be fully lazy.
>
> ! src/share/classes/java/util/Iterables.java
> ! src/share/classes/java/util/Iterators.java
> ! test-ng/tests/org/openjdk/tests/java/util/IterableTest.java
> ! test-ng/tests/org/openjdk/tests/java/util/IterablesTest.java
>
>

Hi Stuart,
null should be an allowed value.
It's really easy to implement it with a null object.
Also I think it's better to let the user choose which Set he wants to use
(the equals semantics is not always the best).

So the code should be something like this:

private static final Object NULL_OBJECT = new Object();

public static<T>  Iterator<T>  uniqueElements(final Iterator<? extends T>  iterator, final Set<? super T>  seen) {
         Objects.requireNonNull(iterator);
         Objects.requireNonNull(cache);

         return new Iterator<T>() {
             private T cache = NULL_OBJECT;

             @Override
             public boolean hasNext() {
                 if (cache != NULL_OBJECT) {
                     return true;
                 }

                 // cache is empty so attempt to populate it
                 while (iterator.hasNext()) {
                     T tmp = iterator.next();
                     if (seen.add(tmp)) {
                         cache = tmp;
                         return true;
                     }
                 }
                 return false;
             }

             @Override
             public T next() {
                 if (!hasNext()) {
                     throw new NoSuchElementException();
                 }
                 T r = cache;
                 cache = NULL_OBJECT;
                 return r;
             }
         };
     }


Rémi



More information about the lambda-dev mailing list