Spliterator.tryAdvance

Remi Forax forax at univ-mlv.fr
Mon Feb 11 07:34:56 PST 2013


There is another point,
the specification should be relatex to allow tryAdvance to not always 
call the consumer taken as parameter.

If by example, I want to implements a Spliterator that filter the elements,
this implementation should be legal:

class FilterSpliterator implements Spliterator {
   private final Spliterator spliterator;
   private final Predicate predicate;

   public FilterSpliterator(Spliterator spliterator, Predicate predicate) {
      ....
   }

   public void tryAdvance(Consumer consumer) {
      spliterator.tryAdvance(element -> {
         if (predicate.test(element)) {
           consumer.accept(element);
         }
      });
   }
}

otherwise, you have to use a while loop around spliterator.tryAdvance but
because there is  no way to transmit the information that the element is 
accepted or not
(see my previous mail), you can not use a lambda here and you have to 
rely on an inner class.

cheers,
Rémi



More information about the lambda-libs-spec-experts mailing list