Stream
和BaseStream
中的每个方法都巧妙地指定操作是中间终端还是短路终端。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
。