Не думаю, что тот факт, что вы храните Stream
как таковой, делает это неловким, но скорее всего, у вас последовательная связь .
Вы должны позвонить hasMoreData
; затем getCurrentStream()
; тогда finish()
. Если вы используете класс только в ограниченном количестве мест, вы, вероятно, сможете сделать его правильно во всех этих; но каждое место, где вы его используете, это новая возможность использовать его неправильно.
Я бы сказал, что ваш класс менеджера на самом деле просто усложняет ситуацию для вас.
for (Optional<Stream<Object>> opt = somethingWhichMightProvideAStream.getNextStream();
opt.isPresent();
opt = somethingWhichMightProvideAStream.getNextStream()) {
try (Stream<Object> stream = opt.get()) { // try-with-resources auto-closes the stream
stream.map(...).filter(...); //etc
}
}
или
Optional<Stream<Object>> opt;
while ((opt = somethingWhichMightProvideAStream.getNextStream()).isPresent()) {
try (Stream<Object> stream = opt.get()) {
stream.map(...).filter(...); //etc
}
}
Объявления циклов в обоих случаях не особенно приятны; но это намного короче (примерно до тех пор, пока у вас уже есть цикл while / try / finally), и, как мне кажется, его сложнее использовать неправильно.
(Правда, у вас все еще есть последовательная связь здесь: вы должны помнить, чтобы закрыть поток, возвращаемый в необязательном порядке. Вздох.)