Loose end: spliterator() and stream() methods on Iterable

Brian Goetz brian.goetz at oracle.com
Wed Jun 26 07:16:38 PDT 2013


Any comments on this spec?  (We can improve to a late-binding 
spliterator as an implementation detail later.)  If no other comments 
then I'll treat this loose end as tied off.

     /**
      * Creates a {@link Spliterator} over the elements described by this
      * {@code Iterable}.
      *
      * @implNote
      * <p>The default implementation should usually be overridden.  The
      * spliterator returned by the default implementation has poor 
splitting
      * characteristics, is unsized, does not report any other spliterator
      * characteristics, and is <em><a 
href="Spliterator.html#binding">early-binding</a></em>.
      * Implementing classes can nearly always provide a better 
implementation.
      * The returned spliterator inherits the <em>fail-fast</em> 
properties of the
      * collection's iterator.
      *
      * @return a {@code Spliterator} over the elements described by this
      * {@code Iterable}.
      * @since 1.8
      */
     default Spliterator<T> spliterator() {
         return Spliterators.spliteratorUnknownSize(iterator(), 0);
     }



On 6/25/2013 12:38 PM, Tim Peierls wrote:
> Not denying the badness of the default implementation, but could it be
> improved (very slightly) by defining and then using a variant of
> spliteratorUnknownSize that takes a Supplier<Iterator> rather than an
> Iterator? Only relevant if you were looking to tip the scales.
>
> --tim
>
> On Tue, Jun 25, 2013 at 11:27 AM, Brian Goetz <brian.goetz at oracle.com
> <mailto:brian.goetz at oracle.com>> wrote:
>
>     As I try to specify even this small addition, I'm still not sure :(
>
>     The default implementation -- which is just
>
>        return Spliterators.__spliteratorUnknownSize(__iterator(), 0);
>
>     should almost always be overriden.  It has crappy parallelism,
>     doesn't know its size, doesn't know any other spliterator
>     characteristics, and is early-binding -- the "grand slam" of bad
>     spliterators.
>
>     The downside is that people will not override spliterator() and
>     result in bad streams.  The upside is that then Iterable *has* a
>     spliterator() method, which reduces the effort for *clients* to make
>     streams out of Iterables.
>
>     Here's what I've got so far:
>
>          /**
>           * Creates a {@link Spliterator} over the elements described by
>     this
>           * {@code Iterable}.
>           *
>           * @implSpec
>           * <p>The default implementation should almost always be
>     overridden.  The
>           * spliterator returned by the default implementation has poor
>     splitting
>           * characteristics, is unsized (and does not report any other
>     spliterator
>           * characteristics), and is <em><a
>     href="Spliterator.html#__binding">early-binding</a></__em>.
>           * Implementating classes can nearly always provide a better
>     implementation.
>           * The returned spliterator inherits the <em>fail-fast</em>
>     properties of the
>           * collection's iterator.
>           *
>           * @return a {@code Spliterator} over the elements described by
>     this
>           * {@code Iterable}.
>           * @since 1.8
>           */
>          default Spliterator<T> spliterator() {
>              return Spliterators.__spliteratorUnknownSize(__iterator(), 0);
>
>          }
>
>
>
>     On 6/25/2013 6:39 AM, Paul Sandoz wrote:
>
>
>         On Jun 24, 2013, at 11:41 PM, Remi Forax <forax at univ-mlv.fr
>         <mailto:forax at univ-mlv.fr>> wrote:
>
>             On 06/24/2013 09:40 PM, Brian Goetz wrote:
>
>                 After further thought, I think what this means is that
>                 we can move spliterator() up to Iterable, but not
>                 stream().  The reason for this is that some classes that
>                 implement Iterable<Integer> might prefer that their
>                 stream() method return an IntStream, not be forced into
>                 a Stream<Integer>.  So putting stream() too high up in
>                 the hierarchy forecloses on this.
>
>
>             I agree,
>
>
>         +1
>
>         Paul.
>
>
>             Spliterator.OfInt is a Spliterator but IntStream is not a
>             Stream.
>
>             Rémi
>
>


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