在流期间强制等待或睡眠
Force a wait or sleep during stream
假设我有:
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
作为多个评论者的建议。因为它需要 Consumer
:
.peek(i -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
})
与其使用 peek,不如将延迟放在调用 API 的地图操作中?
.map(e -> {
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
return Optional.empty();
}
return someRateLimitedApiCall(e);
})
假设我有:
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
作为多个评论者的建议。因为它需要 Consumer
:
.peek(i -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
})
与其使用 peek,不如将延迟放在调用 API 的地图操作中?
.map(e -> {
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
return Optional.empty();
}
return someRateLimitedApiCall(e);
})