RFR: 8015315: Stream.concat methods

Peter Levart peter.levart at gmail.com
Wed Jul 3 09:18:01 UTC 2013

Hi Henry,

I think that ConcatSpliterator.characteristics() method is not honoring 
the spec which says:

      * Returns a set of characteristics of this Spliterator and its
      * elements. The result is represented as ORed values from {@link
      * #ORDERED}, {@link #DISTINCT}, {@link #SORTED}, {@link #SIZED},
      * {@link #NONNULL}, {@link #IMMUTABLE}, {@link #CONCURRENT},
      * {@link #SUBSIZED}. *Repeated calls to {@code characteristics()} on**
**     * a given spliterator should always return the same result.*
      * <p>If a Spliterator reports an inconsistent set of
      * characteristics (either those returned from a single invocation
      * or across multiple invocations), no guarantees can be made
      * about any computation using this Spliterator.
      * @return a representation of characteristics
     int characteristics();

The implementation:

  736         @Override
  737         public int characteristics() {
  738             if (beforeSplit) {
  739                 // Concatenation loses DISTINCT and SORTED characteristics
  740                 return aSpliterator.characteristics() & bSpliterator.characteristics()
  741                        & ~(Spliterator.DISTINCT | Spliterator.SORTED
  742                            | (unsized ? Spliterator.SIZED | Spliterator.SUBSIZED : 0));
  743             }
  744             else {
  745                 return bSpliterator.characteristics();
  746             }
  747         }

...is such that repeated calls to the method can return different 
results over time.

The question is whether the spec. is OK as it is. No constraints are put 
on the characteristics of the Spliterator returned from the trySplit() 
method, so why should "this" Spliterator have constant characteristics 
for the entire lifetime? That is not symmetric. Perhaps the spec. should 
only constrain characteristics to be constant between two consecutive 
calls to trySplit() and only allow characteristics to change as a result 
of trySplit() returning non-null...

Regards, Peter

On 06/29/2013 02:58 AM, Henry Jen wrote:
> Hi,
> Please review the webrev that add concat static method to Stream and
> primitive Streams.
> http://cr.openjdk.java.net/~henryjen/ccc/8015315.0/webrev/
> Cheers,
> Henry

More information about the core-libs-dev mailing list