Skip to content

Instantly share code, notes, and snippets.

@nwillc
Created September 20, 2016 22:32
Show Gist options
  • Save nwillc/90f5f5f87af14a62723916bfaa59aede to your computer and use it in GitHub Desktop.
Save nwillc/90f5f5f87af14a62723916bfaa59aede to your computer and use it in GitHub Desktop.
public final class ExtractorFactory<B> {
private BiConsumer<B, ResultSet> consumer = (b, r) -> {};
private Supplier<B> factory;
public ExtractorFactory<B> factory(Supplier<B> factory) {
this.factory = factory;
return this;
}
public <T> ExtractorFactory<B> add(BiConsumer<B, T> setter,
BiFunction<ResultSet, Integer, T> getter, Integer index) {
final Extraction<B, T> extraction =
new Extraction<>(setter, getter, index);
consumer = consumer.andThen(extraction);
return this;
}
public Extractor<B> getExtractor() {
return new GeneratedExtractor<>(factory, consumer);
}
private static class GeneratedExtractor<B> implements Extractor<B> {
private final Supplier<B> factory;
private final BiConsumer<B, ResultSet> consumer;
GeneratedExtractor(Supplier<B> factory,
BiConsumer<B, ResultSet> consumer) {
this.factory = factory;
this.consumer = consumer;
}
@Override
public B extract(ResultSet rs) throws SQLException {
final B bean = factory.get();
consumer.accept(bean, rs);
return bean;
}
}
private static class Extraction<B, T> implements BiConsumer<B, ResultSet> {
final BiConsumer<B, T> setter;
final BiFunction<ResultSet, Integer, T> getter;
final Integer index;
Extraction(BiConsumer<B, T> setter,
BiFunction<ResultSet, Integer, T> getter, Integer index) {
this.setter = setter;
this.getter = getter;
this.index = index;
}
@Override
public void accept(B bean, ResultSet resultSet) {
setter.accept(bean, getter.apply(resultSet, index));
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment