public static <T> BatchingVisitable<T> getOrderedVisitableUsingSublists(
     final OrderedSublistProvider<T> sublistProvider,
     @Inclusive final long startId,
     final Function<T, Long> idFunction) {
   BatchingVisitable<T> visitableWithDuplicates =
       new AbstractBatchingVisitable<T>() {
         @Override
         protected <K extends Exception> void batchAcceptSizeHint(
             int batchSizeHint, ConsistentVisitor<T, K> v) throws K {
           long nextId = startId;
           boolean abortedOrFinished = false;
           while (!abortedOrFinished) {
             List<T> resultBatchWithDuplicates =
                 sublistProvider.getBatchAllowDuplicates(nextId, batchSizeHint);
             boolean abortedByVisitor = !v.visit(resultBatchWithDuplicates);
             nextId = nextIdStart(resultBatchWithDuplicates, batchSizeHint, idFunction);
             boolean finishedAllBatches = nextId == -1L;
             abortedOrFinished = abortedByVisitor || finishedAllBatches;
           }
         }
       };
   return BatchingVisitables.unique(visitableWithDuplicates);
 }
 public static BatchingVisitable<Long> getOrderedVisitableUsingSublists(
     final OrderedSublistProvider<Long> sublistProvider, @Inclusive final long startId) {
   return BatchingVisitables.getOrderedVisitableUsingSublists(
       sublistProvider, startId, Functions.<Long>identity());
 }