Есть ли правильный способ открыть ресурс для каждого элемента в коллекции, чем использовать потоковый 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, мне просто любопытно, можно ли это сделать с помощью потокового API.