Java 在流期间强制等待或睡眠
假设我有:Java 在流期间强制等待或睡眠,java,java-stream,scheduledexecutorservice,Java,Java Stream,Scheduledexecutorservice,假设我有: list.stream() .map(someService::someRateLimitedApiCall) //does not implement Runnable .filter(Optional::isPresent) .map(Optional::get) .sleep(1000) //is something like this possible? .min...; API服务每秒只允许有限数量的事务,我希望在调用之
list.stream()
.map(someService::someRateLimitedApiCall) //does not implement Runnable
.filter(Optional::isPresent)
.map(Optional::get)
.sleep(1000) //is something like this possible?
.min...;
API服务每秒只允许有限数量的事务,我希望在调用之间引入延迟
如果没有,是否有方法在流的迭代中添加具有固定延迟的执行器
(明确地说,我没有违反外部API的条款,也不会滥用该服务。)简单的解决方案(没有并行流)是按照多个评论者的建议使用peek
。因为它需要一个消费者
:
.peek(i -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
})
与其使用peek,为什么不在调用API的map操作中添加延迟呢
.map(e -> {
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
return Optional.empty();
}
return someRateLimitedApiCall(e);
})
list
是您想要进行的API调用的详尽数目吗?创建批以每秒将它们分派到服务中如何?您是否尝试过使用peek
?peek(Thread.sleep(x))应该可以做到这一点,除非您使用并行流。但对于所有滥用声明的问题,我无法回答。@Naman,这将是一个很好的替代解决方案,尽管可能会像我想象的那样稍微复杂一些;例如,当多个请求独立地触发流时会发生什么情况?最好将此代码作为函数waitAndCallService
移动,以便流看起来漂亮干净->映射(waitAndCallService())。过滤器(…………