@Override
    public List<R> subList(int fromIndex, int toIndex) {
        List<R> r = new ArrayList<>();
        Iterator<R> itr = iterator();
        hudson.util.Iterators.skip(itr, fromIndex);
        for (int i=toIndex-fromIndex; i>0; i--) {
            r.add(itr.next());
        }
        return r;
    }
@ Override public List < R > subList ( int fromIndex , int toIndex ) { List < R > r = new ArrayList < > ( ) ; Iterator < R > itr = iterator ( ) ; hudson . util . Iterators . skip ( itr , fromIndex ) ; for ( int i = toIndex - fromIndex ; i > 0 ; i -- ) { r . add ( itr . next ( ) ) ; } return r ; }
{@link AbstractList#subList(int, int)} isn't very efficient on our {@link Iterable} based implementation.
In fact the range check alone would require us to iterate all the elements,
so we'd be better off just copying into ArrayList.