package ch.claude_martin; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Spliterator; import java.util.Spliterators; import java.util.function.Consumer; import java.util.stream.Stream; import java.util.stream.StreamSupport; class SomeClass { public static void main(String[] args) throws Throwable { Connection conn = null; PreparedStatement stmt = conn.prepareStatement("SELECT * FROM FOO", ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); ResultSet rs = stmt.executeQuery(); long size; try { rs.last(); size = rs.getRow(); rs.beforeFirst(); } catch (Exception ex) { size = Long.MAX_VALUE; } Stream stream = StreamSupport.stream(new AbstractSpliteratorExtension(rs, size), false); var result = stream.map(mapper1).map(mapper2).filter(someFilter).collect(myCollector); } private static final class AbstractSpliteratorExtension extends Spliterators.AbstractSpliterator { private final ResultSet rs; private AbstractSpliteratorExtension(ResultSet rs, long size) { super(size, Spliterator.ORDERED); this.rs = rs; } @Override public boolean tryAdvance(Consumer action) { try { if (!rs.next()) return false; action.accept(Foo.of(rs)); return true; } catch (SQLException e) { throw new RuntimeException(e); } } } public static class Foo { public static Foo of(ResultSet rs) { ... } } }