Stream.close()是终端操作吗?

时间:2016-04-10 05:14:50

标签: java api java-stream

StreamBaseStream中的每个方法都巧妙地指定操作是中间还是(短路)终端。

例外是close()方法,它只声明调用关闭处理程序。

我假设close()是终端操作,并且调用其他方法将导致IllegalStateException。但是,就目前而言,似乎需要由实施来决定。

Javadoc中的遗漏是疏忽还是这是故意的,我错过了什么?

2 个答案:

答案 0 :(得分:3)

Stream.close()既不是中间操作也不是终端操作。它根本不是一个操作(在Stream API的意义上)。回想一下,在调用终端操作之后,不允许在同一个流上调用另一个操作。

但是,不仅允许在终端操作后在close() 上调用预期使用Stream,所以它不是那种流操作。关闭流的操作与禁止对Stream进行后续操作的终端操作具有相同的属性(如果它们由于已开始的终端操作而未被禁止)并且确实有点不明确。

但另一方面,这是使close操作使得资源或对象无法用于后续操作的正常行为,因此对于Streams而言,这也不足为奇。

在实践中,well-known error message说明了自己,因为它名称“已经在”或“关闭”,因为两个同等理由拒绝遵循 - 操作。

答案 1 :(得分:1)

我认为Stream.close()可以被视为终端操作。 流管道中的一项操作,它将流作为输入并生成结果或副作用。执行终端操作后,流管道被认为已消耗,无法再使用。

现在,如果检查close()操作的实现,则如下所示:

public void close() {
    linkedOrConsumed = true; // it sets the flag consumed as true

现在如果你试图使用map操作来访问流,那么你将得到一个IllegalStateException,因为在ReferencePipelines的构建过程中有检查。

    if (previousStage.linkedOrConsumed)
        throw new IllegalStateException(MSG_STREAM_LINKED);

尝试使用以下代码:

    Stream<String> stream = Arrays.stream(myStringNumbers); 
    stream.close();
    List<Integer> list1 = stream.map(Integer::parseInt).collect(toList());

以上代码将抛出IllegalStateException