Stream
和BaseStream
中的每个方法都巧妙地指定操作是中间还是(短路)终端。
例外是close()
方法,它只声明调用关闭处理程序。
我假设close()
是终端操作,并且调用其他方法将导致IllegalStateException
。但是,就目前而言,似乎需要由实施来决定。
Javadoc中的遗漏是疏忽还是这是故意的,我错过了什么?
答案 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
。