On 2024/10/19 16:16:09 "Gary D. Gregory" wrote:
> 
> 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.

Doh, we already have org.apache.commons.collections4.iterators.FilterIterator.

Gary

> 
> 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
> 
> 

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org

Reply via email to