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())。过滤器(…………