Java takeWhile是模拟循环中断的正确方法吗

Java takeWhile是模拟循环中断的正确方法吗,java,java-stream,Java,Java Stream,假设,我需要对流的每个元素应用一些函数,直到满足某些条件。但是,要检查条件,我需要应用该函数,因此将takeWhile和forEachOrdered分开是行不通的。比如说, stream.map(...).takeWhile(p -> { try { write(p); return true; } catch (IOException e) { log(e.getMessage()); return fals

假设,我需要对流的每个元素应用一些函数,直到满足某些条件。但是,要检查条件,我需要应用该函数,因此将
takeWhile
forEachOrdered
分开是行不通的。比如说,

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

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


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

你误用了
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()
是由
write

@nullpointer抛出的原始
IOException
,是的,它会。这就是为什么我不能将
takeWhile
forEach
分开
write
只是执行一些可能引发
IOException
的操作。实际上,除非
write
方法出现异常或流以其他方式耗尽,否则这将继续写入。但是,这仍然取决于
write
map
来完全确定此案例是否需要
forEach
甚至流。谢谢,但是如果
write
也可能引发
取消选中的异常
,该怎么办?那么我会不会处理不当呢?你是对的,问题中的代码将继续编写,除非出现异常。作为一个
forEach
终端操作来处理应该很好。@federicoperataschaffner,我看到这个代码捕获任何异常并记录它。但是,我只想记录
write
引发的一种特定类型的异常。我想,在这种情况下,我必须依赖于
instanceof
?(例如
如果(e.getCause()instanceof MyException){…}或者{throw e}
)如果我是对的,我希望你在答案中包含这一点,这样我就可以把它标记为正确的,我认为你原来的解决方案要好得多。如果
write
声明抛出
IOException
,它不应该也抛出
UncheckedIOException
,但即使它这样做了,在您能够处理包含的
IOException
的位置将其展开也是正确的做法。
UncheckedIOException
类型并不意味着引入新的语义。