私はすべての私の研究に少し混乱しています。私は TabularResultSet という名前のカスタム インターフェイスを持っています (例のために骨抜きにしました)。これは、本質的に表形式のデータ セットを通過します。イテレータのような next() メソッドがあり、QueryResultSet、クリップボードからのタブ付きテーブル、CSV などをループできます。
ただし、 TabularResultSet をラップして簡単にストリームに変換する Spliterator を作成しようとしています。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;
}
}
}