Я немного смущен всеми моими исследованиями. У меня есть собственный интерфейс под названием TabularResultSet (который я упростил для примера), который проходит через любой набор данных, который по своей природе является табличным. У него есть метод next(), такой как итератор, и он может проходить через QueryResultSet, таблицу с вкладками из буфера обмена, CSV и т. д.
Однако я пытаюсь создать Spliterator, который обертывает мой TabularResultSet и легко превращает его в поток. Я не могу представить себе безопасный способ распараллеливания, потому что TabularResultSet может проходить через QueryResultSet, а одновременный вызов next() может нанести ущерб. Единственный способ, которым я представляю, что распараллеливание может быть выполнено безопасно, - это вызов next() одним рабочим потоком, и он передает данные параллельному потоку для работы с ним.
Поэтому я думаю, что распараллеливание — не самый простой вариант. Как мне просто заставить эту вещь работать без распараллеливания? Вот моя работа на данный момент...
public final class SpliteratorTest {
public static void main(String[] args) {
TabularResultSet rs = null; /* instantiate an implementation; */
Stream<TabularResultSet> rsStream = StreamSupport.stream(new TabularSpliterator(rs), false);
}
public static interface TabularResultSet {
public boolean next();
public List<Object> getData();
}
private static final class TabularSpliterator implements Spliterator<TabularResultSet> {
private final TabularResultSet rs;
public TabularSpliterator(TabularResultSet rs) {
this.rs = rs;
}
@Override
public boolean tryAdvance(Consumer<? super TabularResultSet> action) {
action.accept(rs);
return rs.next();
}
@Override
public Spliterator<TabularResultSet> trySplit() {
return null;
}
@Override
public long estimateSize() {
return Long.MAX_VALUE;
}
@Override
public int characteristics() {
return 0;
}
}
}