[jOOQ/jOOQ#18983] Avoid calling Stream::collect in Result::collect and Cursor::collect

This commit is contained in:
Lukas Eder 2025-09-01 15:48:58 +02:00
parent e94a17ac47
commit 4abe0645b1
3 changed files with 19 additions and 2 deletions

View File

@ -75,7 +75,7 @@ abstract class AbstractCursor<R extends Record> extends AbstractResult<R> implem
@Override
public final <X, A> X collect(Collector<? super R, A, X> collector) {
return stream().collect(collector);
return Tools.collect(this, collector);
}
@Override

View File

@ -53,6 +53,8 @@ import java.util.List;
import java.util.ListIterator;
import java.util.Map;
import java.util.Set;
import java.util.function.BiConsumer;
import java.util.function.Supplier;
import java.util.stream.Collector;
import org.jooq.Attachable;
@ -109,7 +111,7 @@ final class ResultImpl<R extends Record> extends AbstractResult<R> implements Re
@Override
public final <X, A> X collect(Collector<? super R, A, X> collector) {
return stream().collect(collector);
return Tools.collect(this, collector);
}
@Override

View File

@ -275,6 +275,7 @@ import java.util.function.Supplier;
import java.util.regex.MatchResult;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collector;
import java.util.stream.IntStream;
import java.util.stream.Stream;
@ -6851,6 +6852,20 @@ final class Tools {
return result;
}
/**
* [#18983] A simpler {@link Collector} accepting utility than
* {@link Stream#collect(Collector)} for internal, sequential only use.
*/
static final <E, A, R> R collect(Iterable<E> iterable, Collector<? super E, A, R> collector) {
A a = collector.supplier().get();
BiConsumer<A, ? super E> acc = collector.accumulator();
for (E e : iterable)
acc.accept(a, e);
return collector.finisher().apply(a);
}
static final <E> Iterator<E> filter(Iterator<E> iterator, Predicate<? super E> predicate) {
return filter(iterator, (e, i) -> predicate.test(e));
}