25 Ekim 2023 Çarşamba

ResultSet Stream Dönüşümü

Giriş
1. ResultSet nesnesi iterator ile sarmalanır
2. Iterator nesnesi StreamSupport kullanılarak Stream'e çevrilir.
3. Sonra şöyle yaparız
Stream<ResultSet> resultSetStream = ...
resultSetStream
  .limit(5) // Take the first 5 items
  .forEach(row -> {
    // Process the row here
});

Çevrim

Örnek
Elimizde şöyle bir kod olsun
public static void closeResource(AutoCloseable closeable) {
  if (closeable == null) {
    return;
  }
  try {
    closeable.close();
  } catch (Exception e) {
    ...
  }
}
Şöyle yaparız. Burada ResultSet kapatılıyor.  

Not : Sarmalayan iterator Java Iterator arayüzünü tam gerçekleştirmiyor. Çünkü hasNext() çağrısının yapılmasını şart hale getirmiş ama çok önemli değil çünkü SplitIterator sınıfı Iterator.hasNext() çağrısı yapmayı garanti ediyor. 
public static Stream<ResultSet> toStream(ResultSet resultSet) {
  Spliterator<ResultSet> spliterator = Spliterators.spliteratorUnknownSize(
    new Iterator<>() {
      @Override
      public boolean hasNext() {
        try {
          return resultSet.next();
        } catch (SQLException sqlException) {
          return false;
        }
      }

      @Override
      public ResultSet next() {
        return resultSet;
      }
    },
    Spliterator.IMMUTABLE | Spliterator.NONNULL | Spliterator.ORDERED
  );

  return StreamSupport.stream(spliterator, false).onClose(() -> closeResource(resultSet));
}

Hiç yorum yok:

Yorum Gönder