【发布时间】:2016-04-22 07:31:20
【问题描述】:
众所周知,Javadoc 提到了Stream 接口:
Streams 有一个 BaseStream.close() 方法并实现 AutoCloseable, 但几乎所有流实例实际上都不需要关闭 使用后。 一般来说,只有源是 IO 通道的流(例如 因为 Files.lines(Path, Charset)) 返回的那些需要关闭。 大多数流由集合、数组或生成器支持 功能,不需要特殊的资源管理。 (如果一个流 确实需要关闭,它可以声明为一个资源 try-with-resources 语句。)
好的,但是同时这个接口里面还有flatMapToInt这样的方法:
IntStream flatMapToInt(Function<? super T, ? extends IntStream> mapper);
Javadoc 规范规定:
每个映射流在其内容被放入后关闭 这个流。
所以,我不明白:如果IntStream 的源中没有设计为具有 IO 通道,为什么它会在此方法中关闭?
例如,ReferencePipeline 实现是这样的:
try (IntStream result = mapper.apply(u)) {
if (result != null)
result.sequential().forEach(downstreamAsInt);
}
更一般的问题可能是:我们是否应该关心关闭像IntStream(或其后代)这样的流?如果不是,那为什么flatMapTo* 关心?
编辑 @Tunaki 为我提供了一个非常有趣的email link。但这一切都是关于flatMap,我同意,在一般情况下我们应该关闭流。但我的问题是关于特殊情况:flatMapToInt、flatMapToLong 等等,我认为没有必要关闭流。
EDIT-2 @BrianGoetz 在这里上诉,因为这是他引用的电子邮件,因此他在主题中:)
【问题讨论】:
-
将
flatMapToInt与flatMap区别对待是没有意义的。IntStream也可以持有资源;仅仅因为尾部出现的是int,并不意味着源不是以非内存资源开始的。例如,假设有一个flatMapToInt,其中每个元素都被平面映射到Files.lines().mapToInt(String::length)?
标签: java java-8 java-stream