【发布时间】:2020-07-30 15:17:12
【问题描述】:
给定一个使用流的 Java 函数:
List<String> function(List<String> input) {
Stream<String> a = input.parallelStream();
Stream<String> b = a.map(c -> c.toString());
return b.collect(Collectors.toList());
}
现在,我想控制映射是否由参数执行。 Eclipse/编译器给了我一个警告:Resource leak: 'a' is never closed
List<String> function(List<String> input, boolean doMap) {
Stream<String> a = input.parallelStream(); // Resource leak: 'a' is never closed
Stream<String> b = doMap ? a.map(c -> c.toString()) : a;
return b.collect(Collectors.toList());
}
我可以使用 try-with-resources 语句解决这个问题:
List<String> function(List<String> input, boolean doMap) {
try (Stream<String> a = input.parallelStream()) {
Stream<String> b = doMap ? a.map(c -> c.toString()) : a;
return b.collect(Collectors.toList());
}
}
我的问题是:当我使用流而不是 for 循环时,为什么会出现资源泄漏?如果我只可选地添加映射步骤,为什么会出现资源泄漏? (为什么在函数的第一个版本中没有资源泄漏?)有条件地组合处理流是否“危险”?我错过了什么?
【问题讨论】:
-
我是上述问题的提问者。
Stream实现了导致问题的AutoCloseable。这是 Eclipse 特有的,我无法在 Intellij Idea 中重现。随意压制警告,不关闭此资源没有危险。 Java 8 的AutoCloseable的 JavaDoc 证实了这一点(虽然不是 Java 7)。
标签: java java-stream resource-leak