Моя настройка следующая: у меня есть метод DAO, который может извлекать страницы данных из БД. В частности, для подкачки используется MySQL SEEK. То есть, чтобы получить страницу 5, вам необходимо предоставить методу последнюю запись страницы 4.
Каков самый простой способ адаптации этого стиля разбиения по страницам на Java Stream? Для моего варианта использования библиотеки подходят, а фреймворки (Spring, Androidx и т. д.) — нет.
Моя реализация
Я написал свою собственную реализация следующим образом. (
Код: Выделить всё
Field
Код: Выделить всё
public abstract class PagedSeekIterator implements Iterator {
private K lastId = null;
private boolean done = false;
private Iterator currentIterator = null;
private final Field idField;
public PagedSeekIterator(Field idField) {
this.idField = idField;
}
@Override
public boolean hasNext() {
if (done) {
return false;
}
try {
if (currentIterator == null) {
// first call. Do init
currentIterator = fetchWithSeek(lastId).iterator();
return hasNext();
}
if (currentIterator.hasNext()) {
return true;
} else {
// current page is read through. Fetch next page
Result res = fetchWithSeek(lastId);
if (res.isEmpty()) {
// we're done here
done = true;
currentIterator = null;
return false;
} else {
// next page looks good
currentIterator = res.iterator();
return true;
}
}
} catch (SQLException e) {
throw new SqlRuntimeException("Failed to fetch page", e);
}
}
@Override
public Record next() {
if (!hasNext()) {
throw new NoSuchElementException("We're done here.");
}
Record rec = currentIterator.next();
lastId = rec.get(idField);
return rec;
}
// lastId will be null on the first call
protected abstract Result fetchWithSeek(K lastId) throws SQLException;
}
Код: Выделить всё
Streams.stream(new PagedSeekIterator(Actions.ACTION.ID){
// override fetchWithSeek()
});
// returns a lazy Stream
Другие вещи, которые я пробовал< /h2>
Я также пытался изучить AndroidX Paging, но использовать его вне контекста Android/Kotlin болезненно, и я обнаружил, что это добавляет больше сложности, чем облегчает мой простой Java-проект.< /п>
Подробнее здесь: https://stackoverflow.com/questions/763 ... ava-stream