Адаптация выгружаемых данных к Java StreamJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Адаптация выгружаемых данных к Java Stream

Сообщение Anonymous »

Я хочу взять постраничные данные (из БД) и адаптировать их в поток Java с отложенной загрузкой, чтобы клиентам моего DAO не приходилось беспокоиться об индексах страниц, смещениях и т. д. >
Моя настройка следующая: у меня есть метод DAO, который может извлекать страницы данных из БД. В частности, для подкачки используется MySQL SEEK. То есть, чтобы получить страницу 5, вам необходимо предоставить методу последнюю запись страницы 4.
Каков самый простой способ адаптации этого стиля разбиения по страницам на Java Stream? Для моего варианта использования библиотеки подходят, а фреймворки (Spring, Androidx и т. д.) — нет.
Моя реализация
Я написал свою собственную реализация следующим образом. (, Record и Result являются классами JOOQ)

Код: Выделить всё

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;
}
А затем Guava удобно позаботится об адаптации к потоку:

Код: Выделить всё

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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Какова связь между структурой данных Stream (java.util.stream) и LinkedList в Java?
    Anonymous » » в форуме JAVA
    0 Ответы
    61 Просмотры
    Последнее сообщение Anonymous
  • Получение списка из java.util.stream.Stream в Java 8
    Anonymous » » в форуме JAVA
    0 Ответы
    30 Просмотры
    Последнее сообщение Anonymous
  • Получение списка из java.util.stream.stream в Java 8
    Anonymous » » в форуме JAVA
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Алгоритм непрерывной математической минимизации/адаптация библиотеки
    Anonymous » » в форуме C#
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Относительная адаптация размера iFrame в зависимости от размера мобильного окна.
    Anonymous » » в форуме CSS
    0 Ответы
    28 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»