Используя API Java 8 Stream
, я хотел бы зарегистрировать "крюк завершения" по строкам:
Stream<String> stream = Stream.of("a", "b", "c");
// additional filters / mappings that I don't control
stream.onComplete((Completion c) -> {
// This is what I'd like to do:
closeResources();
// This might also be useful:
Optional<Throwable> exception = c.exception();
exception.ifPresent(e -> throw new ExceptionWrapper(e));
});
Причина, по которой я хочу сделать это, - это то, что я хочу, чтобы ресурс в Stream
для клиентов API потреблял, и я хочу, чтобы Stream
автоматически очищал ресурс после его потребления. Если это было возможно, клиент мог бы позвонить:
Collected collectedInOneGo =
Utility.something()
.niceLookingSQLDSL()
.moreDSLFeatures()
.stream()
.filter(a -> true)
.map(c -> c)
.collect(collector);
Вместо того, что нужно сейчас:
try (Stream<X> meh = Utility.something()
.niceLookingSQLDSL()
.moreDSLFeatures()
.stream()) {
Collected collectedWithUglySyntacticDissonance =
meh.filter(a -> true)
.map(c -> c)
.collect(collector);
}
В идеале я хотел бы войти в java.util.stream.ReferencePipeline
различные методы, такие как:
@Override
final void forEachWithCancel(Spliterator<P_OUT> spliterator, Sink<P_OUT> sink) {
try {
// Existing loop
do { } while (!sink.cancellationRequested() && spliterator.tryAdvance(sink));
}
// These would be nice:
catch (Throwable t) {
completion.onFailure(t);
}
finally {
completion.onSuccess();
}
}
Есть ли простой способ сделать это с помощью существующего API JDK 8?