On 2024/10/19 16:12:45 "Gary D. Gregory" wrote: > Hi Claude, > > Interesting stuff :-) > > I'll assume that you intend this discussion for Commons Collections. Note > that there are some stream/iterator mix utilities in Commons Lang in the > org.apache.commons.lang3.stream.Streams class. > > A few comments below. > > On 2024/10/19 10:15:38 Claude Warren wrote: > > I would like to introduce a new Iterator to the iterator library: > > ExtendedIterator > > > > This Iterator is an Iterator that extends the functionality of other > > iterators and makes using some iterators in the library more idiomatic. It > > is based on the ExtendedIterator found in the new Apache Rat core package > > that was inspired by the Apache Jena ExtendedIterator interface. > > > > I propose a class ExtendedIterator<T> that extends Iterator<T> and has the > > following additional methods. > > Assuming that other calls are delegated to the underlying Iterator, a name > that matches the JDK that might be better is "FilterIterator", much like what > a FilterInputStream does for an InputStream.
Maybe there a plain FilterIterator like FilterInputStream and a FilterIterator subclass that has the additional methods, not sure. Gary > > > > > Static methods (all methods return an ExtendedIterator<T>) > > > > - createNoRemove(final Iterator<T> it) -- prohibits removal on an > > iterator that otherwise would allow removal. > > You'll need to specify what this means: Does the turn the call into a noop or > provides the default Iterator implementation, throwing a > UnsupportedOperationException > > > - ofStream(final Stream<T> stream) -- convenience method to create > > ExtendedIterator from stream. > > I don't think the name should "double-up" the words "of" and "Stream". Either > follow the JDKs, example of java.util.Arrays.stream(...) where the target > type is the method name, so in this case "iterator", or since we know we're > creating an Iterator, just "of", like java.util.stream.Stream.of(T...) and > org.apache.commons.lang3.stream.Streams.of(Iterator<E>) > > > - create(final Iterator<T> it)-- creates an ExtendedIterator from a > > plain iterator. If the Iterator is already "extended" just return it. > > - emptyIterator() -- convenience method to creat an empty > > ExtendedIterator. > > - unwind(final Iterator<Iterator<T>> woundIterator) -- creates an > > Iterator<T> by iterating through each of the iterators in "woundIterator" > > The wind/unwind terminology does not make sense to me. I think we should > follow what the JDK does with Stream and call this operation "flat" or > "flatten", following Stream.flatMap(Function) and other Stream "flat" methods. > > > > > Instance methods (Unless otherwise noted all methods return an > > ExtendedIterator<T>) > > > > - T removeNext() -- extracts the next item from the iterator and calls > > remove() to remove it. > > - andThen(final Iterator<X> other)-- <X extends T> uses an IteratorChain > > to create a chain of iterators. > > - filter(final Predicate<T> predicate) -- uses a FilterIterator to > > exclude the items from the iterator. > > - ExtendedIterator<U> map(final Function<T, U> function) -- uses a > > TransformerIterator to transform the items to a new type. > > - <U extends Collection<T>> U addTo(final U collection) -- Adds the > > remaining items in the iterator to the collection. > > > > The advantage of the iterator is the idiomatic nature. > > > > Iterator<Thing> iter; > > List<OtherThing> lst = > > ExtendedIteratot.create(iter).filter(Thing::isValid).map(thing -> new > > OtherThing(thing)).addTo(new ArrayList<>()); > > Note that Streams use the "collect" name for this type of operation. > > I am somewhat concerned that this proposal is implementing what already in > Streams but with Iterator. It might just be simpler to use Streams, > _especially_ considering your last example, which is very stream-like. > > TY! > Gary > > > > > Claude > > -- > > LinkedIn: http://www.linkedin.com/in/claudewarren > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org > For additional commands, e-mail: dev-h...@commons.apache.org > > --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org For additional commands, e-mail: dev-h...@commons.apache.org