Created
June 11, 2018 06:38
-
-
Save chenqiyue/e5b1c8af5c6354148406768d8b4883c9 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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