Я не нашел лучшего решения, чем рассчитать и получить две страницы, используя PagingPredicate и получить подсписок из этого результата, чтобы получить данные со смещением и ограничением, как в базах данных SQL.
Пример метода:
public Set<M> findOffsetValues(int offset,int limit) {
PagingPredicate pagingPredicate = new PagingPredicate<>(getDefaultComporator(), limit);
pagingPredicate.setPage(offset / limit);
List<M> page = new ArrayList<>(itemsCacheMap.values(pagePredicate));
pagePredicate.nextPage();
page.addAll(itemsCacheMap.values(pagePredicate));
int startIndex = offset % limit;
return new LinkedHashSet<>(CollectionUtil.saveSublist(page, startIndex, startIndex + limit));
}
Служебный метод CollectionUtil.saveSublist
public static <E> List<E> saveSublist(List<E> list, int fromIndex, int toIndex) {
int checkedFromIndex = list.size() == 0
? 0
: fromIndex >= list.size() ? list.size() - 1 : fromIndex;
int checkedToIndex = toIndex > list.size() ? list.size() : toIndex;
return list.subList(checkedFromIndex, checkedToIndex);
}