有没有正确的方法为集合中的每个元素打开资源,而不是使用流 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 完成。