On Jan 23, 2015, at 8:26 PM, Xueming Shen <xueming.s...@oracle.com> wrote:

> The webrev looks good.
> 

Thanks.


> However I have a question regarding the spec of 
> CharsSequence.chars/codePoints(). It says
>     *
>     * <p>If the sequence is mutated while the stream is being read, the
>     * result is undefined.
> 
> But it looks like ABS.chars/codePoints() "predefine/fix" the size of the 
> resulting stream when
> the stream is being created/initialized.

No, because a supplier of a spliterator is used (as is the case for the 
CharSequence implementations):

return StreamSupport.intStream(
        () -> new String.IntCharArraySpliterator(value, 0, count, 0),
        Spliterator.ORDERED | Spliterator.SIZED | Spliterator.SUBSIZED,
        false);

the "value" and the "count" will be obtained when the terminal operation 
executed not when the Stream is created and returned.
 

> The possible corner case is that the "size/length" of
> ABS is changed between the stream is created  and read?
> 
> I would assume the CharSequence default implementation will go after the real 
> size, even
> a "length()" is passed in as an estimated size during creation, but the 
> optimized implementation
> will only return the length/size of char/cp when the stream is created. A 
> behavior change?
> 

For CharSequence.chars() the length() is taken as the exact size:

return StreamSupport.intStream(() ->
        Spliterators.spliterator(
                new CharIterator(),
                length(),
                Spliterator.ORDERED),
        Spliterator.SUBSIZED | Spliterator.SIZED | Spliterator.ORDERED,
        false);

and (like above) is called when the terminal operation executes. So it's 
equivalent behaviour regarding when the snapshot of the sequence length is 
obtained.

Paul.

Reply via email to