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
类型并不意味着引入新的语义。