是采取适当的方法模拟循环中断的方法

时间:2019-02-08 20:17:50

标签: java java-stream

假设,我需要对流的每个元素应用某些功能,直到满足特定条件为止。但是,要检查条件,我需要应用该函数,因此无法在ThentakeWhile上进行分离。例如,

forEachOrdered

在这里,我不想多次stream.map(...).takeWhile(p -> { try { write(p); return true; } catch (IOException e) { log(e.getMessage()); return false; } }); 失败,所以一旦log失败,我想停止迭代。

我怀疑这是正确的(?)解决方案,因为write的结果是未使用的,只是多余的。

有没有更好的方法来处理这种情况?我的解决方案真的可以吗?

1 个答案:

答案 0 :(得分:2)

您滥用takeWhile。对于您的情况,使用forEachOrdered就足够了,因为如果抛出异常,则流中的其余元素将不被处理:

try {
    stream.map(...).forEachOrdered(p -> {
        try {
            write(p);
        } catch (IOException e) {
            throw new UncheckedIOException(e);
        }
    });
} catch (UncheckedIOException e) {
    log(e.getCause().getMessage());
}

这里,e.getCause()IOException抛出的原始write