Skip to content

Instantly share code, notes, and snippets.

@chenqiyue
Created June 11, 2018 06:38
Show Gist options
  • Save chenqiyue/e5b1c8af5c6354148406768d8b4883c9 to your computer and use it in GitHub Desktop.
Save chenqiyue/e5b1c8af5c6354148406768d8b4883c9 to your computer and use it in GitHub Desktop.
import lombok.Setter;
import lombok.experimental.Accessors;
import org.jetbrains.annotations.NotNull;
import java.util.Iterator;
import java.util.function.BiFunction;
/**
* 支持翻页遍历的Iterable
*
* @author cqy
* @date 2018/06/11
*/
public class PageableIterable<T> implements Iterable<T> {
@java.beans.ConstructorProperties({"pageSize", "pageFunc"})
private PageableIterable(int pageSize,
BiFunction<Integer, Integer, Page<T>> pageFunc) {
this.pageSize = pageSize;
this.pageFunc = pageFunc;
}
public static <T> PageableIterable<T> of(int pageSize,
BiFunction<Integer, Integer, Page<T>> func) {
return new PageableIterable<T>(pageSize, func);
}
public interface Page<T> {
boolean hasNextPage();
Iterator<T> iterator();
}
public static <T> Page<T> page(boolean hasNextPage, Iterator<T> iterator) {
return new Page<T>() {
@Override
public boolean hasNextPage() {
return hasNextPage;
}
@Override
public Iterator<T> iterator() {
return iterator;
}
};
}
final int pageSize;
final BiFunction<Integer, Integer, Page<T>> pageFunc;
@Setter
@Accessors(fluent = true)
private int minPageIndex = 0;
@Setter
@Accessors(fluent = true)
private int maxPageIndex = Integer.MAX_VALUE;
@NotNull
@Override
public Iterator<T> iterator() {
return new Iterator<T>() {
private int pageIndex = PageableIterable.this.minPageIndex;
Page<T> target = null;
@Override
public boolean hasNext() {
if (target == null || (!target.iterator().hasNext() && target.hasNextPage())) {
if (pageIndex > maxPageIndex) {
return false;
}
target = pageFunc.apply(pageIndex++, pageSize);
}
return target.iterator().hasNext();
}
@Override
public T next() {
return target == null ? null : target.iterator().next();
}
};
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment