Java 关闭映射流-什么';什么主意?

Java 关闭映射流-什么';什么主意?,java,java-8,java-stream,Java,Java 8,Java Stream,众所周知,Javadoc提到了Stream接口: IntStream flatMapToInt(Function<? super T, ? extends IntStream> mapper); 流有一个BaseStream.close()方法并实现自动关闭, 但几乎所有流实例实际上都不需要关闭 使用后通常,只有源为IO通道的流(例如 与Files.lines(Path,Charset))返回的文件一样,需要关闭。 大多数流都由集合、数组或生成流提供支持 不需要特殊资源管理的功能。

众所周知,Javadoc提到了
Stream
接口:

IntStream flatMapToInt(Function<? super T, ? extends IntStream> mapper);
流有一个BaseStream.close()方法并实现自动关闭, 但几乎所有流实例实际上都不需要关闭 使用后通常,只有源为IO通道的流(例如 与Files.lines(Path,Charset))返回的文件一样,需要关闭。 大多数流都由集合、数组或生成流提供支持 不需要特殊资源管理的功能。(如果是溪流 如果不需要关闭,则可以在 请尝试使用资源语句。)

好的,但同时在这个界面中有类似
flatMapToInt
的方法:

IntStream flatMapToInt(Function<? super T, ? extends IntStream> mapper);
更一般的问题可能是:我们是否应该关心关闭像
IntStream
(或其后代)这样的流?如果没有,那么为什么
flatMapTo*
会在意呢

编辑@Tunaki为我提供了一个非常有趣的。但这一切都是关于
flatMap
,我同意,在一般情况下,我们应该关闭流。但我的问题是关于特殊情况:
flatMapToInt
flatMapToLong
等等,我认为没有必要关闭流


EDIT-2@BrianGoetz在这里被上诉,因为这是他引用的电子邮件,因此他在主题中:)

关于资源处理的一般规则是这样的。
flatMap
操作是流API中打开
的唯一操作,因此它是将其关闭的唯一操作

Brian Goetz引用他的话说:

总之,
flatMap()
是唯一在内部关闭 在它完成之后流,并且有很好的理由——这是唯一一种 流被操作本身有效地打开,因此 也应该被操作关闭。任何其他流都假定为 由调用方打开,因此应由调用方关闭

给出的示例如下。考虑

try (Stream<Path> paths = Files.walk(dir)) {
    Stream<String> stream = paths.flatMap(p ->  {
        try {
            return Files.lines(p);
        } catch (IOException e) {
            throw new UncheckedIOException(e);
        }
    });
}

任何其他流都假定由调用者打开,因此调用者应该关闭-这意味着我们应该使用
try with resource
construction???@Andremoniy操作所有流(比如一些
list.stream()
)。唯一关心的是处理应该关闭的底层资源。好吧,对于
flatMap
,我同意,但是
Int/LongStream
s的想法remains@Andremoniy我有两个理由:一致性和“你应该关闭你打开的东西”的规则@Andremoniy我恐怕无法回答这个问题(只能猜测)因为我不是JDK开发人员;)。将
flatMap
flatMap
区别对待毫无意义。
IntStream
也可以保存资源;仅仅因为从后端出来的是
int
,并不意味着源代码不是从非内存资源开始的。例如,假设有人执行
flatMapToInt
,其中每个元素都被平面映射到
Files.lines().mapToInt(String::length)
try (Stream<Path> paths = Files.walk(dir)) {
    IntStream stream = paths.flatMapToInt(p ->  {
        try {
            return Files.lines(p).mapToInt(String::length);
        } catch (IOException e) {
            throw new UncheckedIOException(e);
        }
    });
}