我想循环一个巨大的数组并执行一系列复杂的指令需要很长时间。但是,如果超过30秒,我希望它放弃。
离。
final long start = System.currentTimeMillis();
myDataStructure.stream()
.while(() -> System.currentTimeMillis() <= start + 30000)
.forEach(e ->
{
...
});
如果符合某个条件,我想避免在return
来电中说forEach
。
答案 0 :(得分:17)
我会为此创建一个自定义池,例如:
<script type="text/javascript">
window.opener.location.href = '@Url.Action("Action", "EventstController")', window.close();
</script>
答案 1 :(得分:15)
由于流 forEach
没有break
,我认为您可以为break
创建自定义例外循环:
myDataStructure.stream()
.forEach(e ->
{
if (System.currentTimeMillis() <= start + 30000) {
throw new MyTimeOutException()
}
});
你可以抓住捕获这个例外。
答案 2 :(得分:15)
如果在这种情况下迭代流或数组与实际执行操作相比是便宜的,而不仅仅是使用谓词并过滤时间是否结束。
final long end = System.nanoTime() + TimeUnit.SECONDS.toNanos(30L);
myDataStructure.stream()
.filter(e -> System.nanoTime() <= end)
.forEach(e ->
{
...
});
问题是您是否需要知道哪些元素已被处理。有了上述内容,您必须检查之后是否对特定元素发生了副作用。
答案 3 :(得分:5)
您可以使用.allMatch()
是一个短路运算符来终止流的事实:
final long start = System.currentTimeMillis();
myDataStructure.stream()
.allMatch(e ->
{
// your task here
return System.currentTimeMillis() <= start + 30000;
});
答案 4 :(得分:3)
正如OP中的评论所说,在Java 8中将错过takeWhile / dropWhile(将在Java 9中添加)。没有任何理由尝试通过异常或其他代码来实现逻辑,因为代码只是看起来如此丑陋而且完全不合理,即使只是为了练习。我认为使用第三方库是一个更好,更好的解决方案,例如StreamEx
StreamEx(source).takeWhile(() -> System.currentTimeMillis() <= start + 30000)
.forEach(e -> { ... });