StreamBaseStream中的每个方法都巧妙地指定操作是中间终端还是短路终端。
close()方法是一个例外,该方法仅声明关闭处理程序被调用。

我假设close()是终端操作,并且调用其他方法将导致IllegalStateException。但是,按照目前的情况,似乎取决于实施情况来决定这一点。

是Javadoc中的遗漏是疏忽还是故意,我是否缺少某些内容?

最佳答案

我认为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

10-05 20:36
查看更多