假设我有一个抛出运行时异常的方法。我正在使用a Stream
来对列表中的项目调用此方法。
class ABC {
public void doStuff(MyObject myObj) {
if (...) {
throw new IllegalStateException("Fire! Fear! Foes! Awake!");
}
// do stuff...
}
public void doStuffOnList(List<MyObject> myObjs) {
try {
myObjs.stream().forEach(ABC:doStuff);
} catch(AggregateRuntimeException??? are) {
...
}
}
}
现在,我希望处理列表中的所有项目,并将单个项目上的所有运行时异常收集到“聚合”运行时异常中,该异常将在最后抛出。
在我的真实代码中,我正在进行第三方API调用,这可能会引发运行时异常。我想确保所有项目都已处理,并在最后报告所有错误。
我可以想到几种破解方法,例如map()
捕获并返回异常的函数( ..shudder ..
)。但是,有没有一种本机的方法可以做到这一点?如果没有,还有另一种方法可以完全实现它吗?
在这种简单doStuff
方法的情况下,void
您只关心异常,可以使事情保持简单:
myObjs.stream()
.flatMap(o -> {
try {
ABC.doStuff(o);
return null;
} catch (RuntimeException ex) {
return Stream.of(ex);
}
})
// now a stream of thrown exceptions.
// can collect them to list or reduce into one exception
.reduce((ex1, ex2) -> {
ex1.addSuppressed(ex2);
return ex1;
}).ifPresent(ex -> {
throw ex;
});
但是,如果您的要求更加复杂,并且您更喜欢使用标准库,CompletableFuture
则可以代表“成功或失败”(尽管有一些缺陷):
public static void doStuffOnList(List<MyObject> myObjs) {
myObjs.stream()
.flatMap(o -> completedFuture(o)
.thenAccept(ABC::doStuff)
.handle((x, ex) -> ex != null ? Stream.of(ex) : null)
.join()
).reduce((ex1, ex2) -> {
ex1.addSuppressed(ex2);
return ex1;
}).ifPresent(ex -> {
throw new RuntimeException(ex);
});
}
假设我有一个抛出运行时异常的方法。我正在使用对列表中的项调用此方法。 现在我希望列表中的所有项目都被处理,并且单个项目上的任何运行时异常都被收集到一个“聚合”运行时异常中,该异常将在最后抛出。 在我的真实代码中,我正在进行第三方API调用,这可能会引发运行时异常。我想确保所有项目都得到处理,并且在最后报告任何错误。 我可以想出一些方法来解决这个问题,比如一个函数,它捕获并返回异常(... shud
假设我有一张房间清单 每个房间都有一份人员名单。 使用java8 streams,我想迭代房间列表,获取所有人员,在每个节点上执行一些方法(doSomething()),并获取所有过滤对象的列表。 这是使用java 8的最佳实践吗?
给java类一些东西 我有一张物品清单 我希望能够对它们进行排序,这样它们就可以按照每个父对象的虚数的累积和排序,然后再按照虚数排序。 所以我最终 我知道用parentKey和sum of noThings映射它是 我想,也许包装我的Something类并获得每个父项的总密钥可能会在某种程度上起作用。 但看起来工作量很大,不太优雅。 如有任何意见/想法,将不胜感激。
我一直在尝试在聚集中添加超时,以避免等待每个流都完成。但是当我添加超时时,它不起作用,因为聚合器等待每个流完成。 E、 在我的流中,其中一个有2秒的延迟,另一个有4秒的延迟 我使用遗嘱执行人。newCachedThreadPool()以并行运行。我想释放包含的每条消息,直到超时完成 我一直在测试的另一种方法是使用默认的gatherer,并在scatterGather中设置GathereTimeou
Java 8并行流在consuming子句中抛出异常时如何表现,例如在处理中?例如,以下代码: 它是否立即停止处理的元素?它是否等待已启动的元素完成?它是否等待所有的流完成?它是否在抛出异常后开始处理流元素? 什么时候回来?在异常之后立即?消费者处理完所有/部分元素后? 在并行流引发异常后,是否继续处理元素?(找到了发生这种情况的案例)。 这里有一般规则吗? 编辑(15-11-2016) 试图确定
你能让我知道如何在新的api中使用与数据流运行器的聚合器吗。?