Есть ли правильный способ открыть ресурс для каждого элемента в коллекции, чем использовать stream api, сделать какие-то map (), filter (), peek () и т. Д. С использованием ресурса и чем закрыть ресурс?
У меня есть что-то вроде этого:
List<String> names = getAllNames();
names.stream().map(n -> getElementFromName(n))
.filter(e -> e.someCondition())
.peek(e -> e.doSomething())
.filter(e -> e.otherCondition())
.peek(e -> e.doSomethingElse())
.filter(e -> e.lastCondition())
.forEach(e -> e.doTheLastThing());
Это должно работать нормально, за исключением того, что я открываю ресурс (например, соединение БД) в методе getElementFromName. Затем я работаю с этим ресурсом в других методах экземпляра, таких как someCondition или doSomething. И я понятия не имею, как правильно его закрыть.
Я знаю, что я использую только промежуточные операции в потоке. Это означает, что все методы оцениваются в операции forEach, и производительность должна быть в порядке, потому что итерация выполняется только один раз.
Но я не могу понять, как закрыть ресурсы, открытые для каждого элемента в методе getElementFromName.
Я могу сохранить список всех элементов, созданных getElementFromName, и закрыть ресурсы позже. Но я бы просто терял пространство, сохраняя все ресурсы живыми. Также будет вторая итерация по списку элементов. Что делает избегание потока API предпочтительным в этом случае. Так есть ли способ как-то автоматически закрыть ресурс, когда я закончу с использованием элемента?
Также я знаю, что это легко сделать с помощью foreach lopp, мне было просто интересно, если это можно сделать с помощью stream api.