Java Stream.forEach
函数有一个严重的限制,即它的消费者不可能抛出已检查的异常。因此,我想逐个访问Stream的元素。
我想做这样的事情:
while(true) {
Optional<String> optNewString = myStream.findAny();
if (optNewString.isPresent())
doStuff(optNewString.get());
else
break;
}
但是,findAny
是短路终端操作。也就是说,它会关闭流。此代码将在while循环的第二次迭代时崩溃。我不能简单地将所有元素放在一个数组中,并逐个遍历该数组,因为可能存在数千万个元素。
请注意我不会问如何在forEach
内抛出异常。这个问题有already been answered。
答案 0 :(得分:11)
要逐个元素地遍历流,只需调用iterator()
方法:
Iterator<String> iterator = stream.iterator();
while (iterator.hasNext()) {
String element = iterator.next();
// Use element
}
目前尚不清楚在检查异常方面对您有多大帮助,并且值得注意的是它是终端操作 - 一旦您使用了迭代器,您和&#如果你想再次迭代,需要获得一个新流 - 但它确实回答了如何一次读取一个流的问题。