> On 7 Mar 2016, at 15:53, Peter Levart <peter.lev...@gmail.com> wrote:
> 
> 
> 
> On 03/07/2016 01:59 PM, Paul Sandoz wrote:
>>> On 7 Mar 2016, at 12:47, Peter Levart <peter.lev...@gmail.com> wrote:
>>> 
>>> What about a Spliterator based on List.subList() method? While the 
>>> specification of List.subList() does not guarantee any specific behavior 
>>> when underlying list is structurally modified, the implementations (at 
>>> least implementations in JDK based on AbstractList) do have a fail-fast 
>>> behavior and there's a chance other implementations too.
>>> 
>> We currently have as the @implSpec:
>> 
>> * @implSpec
>> * The default implementation creates a
>> * <em><a href="Spliterator.html#binding">late-binding</a></em> spliterator
>> * from the list's {@code Iterator}.  The spliterator inherits the
>> * <em>fail-fast</em> properties of the list's iterator.
>> 
>> Note the inheritance clause, which also covers the sublist case.
>> 
>> We would need to update with something like:
>> 
>> "If this list implements RandomAccess then…. and the spliterator is 
>> late-binding, and fail-fast
>> on a best effort basis if it is detected that this list (or any backing list 
>> if this list is a sub-list) has
>> been structurally modified when traversing due to an change in size as 
>> returned by the size()
>> method."
>> 
>> Paul.
> 
> Hi Paul,
> 
> I don't think you understood my hint.

Clearly not :-) I thought you were asking a general question on subList 
behaviour.

I see what you mean now, specify the default implementation to defer to subList.


> I was thinking of a Spliterator implementation for RandomAccess List(s) that 
> would leverage List.subList() method to implement splitting and/or fail-fast 
> behavior. As there is a good chance that sub-list implementations already 
> provide fail-fast behavior for structural changes in the backing list. For 
> example:
> 
> Spliterator<E> spliterator() {
>  List<E> subList = subList(0, size());
>  return 
> IntStream.range(0,subList.size()).mapToObj(subList::get).spliterator();
> }
> 
> This is a simple variant of Tagir's eager-binding RandomAccess spliterator 
> which is fail-fast if the List's sub-list is fail-fast.
> 

Although that is not not late-binding nor is it terribly efficient (the 
spliterator of stream is an escape hatch, we should try to avoid it for 
critical stuff like that in ArrayList [*]). If there is a constraint to be 
relaxed i would prefer it be the fail-fast properties.


> On 03/07/2016 03:53 PM, Peter Levart wrote:
>> As there is a good chance that sub-list implementations already provide 
>> fail-fast behavior for structural changes in the backing list.
> 
> Ah, well... I checked AbstractMutableList in Eclipse collections and it 
> doesn't provide fail-fast behavior for it's subList(s) unfortunately…
> 

Ok.

Thanks,
Paul.

[*] We did use it in the list implementation for Collection.nCopies, which 
defers to the stream implementation, which in this case is i think justifiable.

Reply via email to