假设,我需要对流的每个元素应用某些功能,直到满足特定条件为止。但是,要检查条件,我需要应用该函数,因此无法在Then
和takeWhile
上进行分离。例如,
forEachOrdered
在这里,我不想多次stream.map(...).takeWhile(p -> {
try {
write(p);
return true;
} catch (IOException e) {
log(e.getMessage());
return false;
}
});
失败,所以一旦log
失败,我想停止迭代。
我怀疑这是正确的(?)解决方案,因为write
的结果是未使用的,只是多余的。
有没有更好的方法来处理这种情况?我的解决方案真的可以吗?
答案 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
。