如何逐个阅读流?

时间:2017-11-01 17:55:15

标签: java java-8 java-stream

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

1 个答案:

答案 0 :(得分:11)

要逐个元素地遍历流,只需调用iterator()方法:

Iterator<String> iterator = stream.iterator();
while (iterator.hasNext()) {
    String element = iterator.next();
    // Use element
}

目前尚不清楚在检查异常方面对您有多大帮助,并且值得注意的是它是终端操作 - 一旦您使用了迭代器,您和&#如果你想再次迭代,需要获得一个新流 - 但它确实回答了如何一次读取一个流的问题。