gpt4 book ai didi

java - 如何减少 Java 中的 Futures 流?

转载 作者:行者123 更新时间:2023-12-01 10:19:48 25 4
gpt4 key购买 nike

假设我给了一个 StreamFutures ,我想通过调用 Stream#reduce 来减少它方法。
但我不想减少Futures本身,而是 Future 的结果( Future#get )。
问题是,get method可能会抛出 ExecutionException并且在这种情况下不提供结果。

这就是为什么

Stream<Future<Integer>> stream = ...;
BinaryOperator<Integer> sum = (i1, i2) -> i1 + i2;
stream.map(future -> future.get())
.reduce(sum); // does not work, get needs to handle exceptions!

所以,我必须捕捉异常:
stream.map(future -> {
Integer i = null;
try {
i = future.get();
} catch (InterruptedException e) {
} catch (ExecutionException e) {}
return i;
}).reduce(sum);

但是在这种方法中,我可能会遇到麻烦,因为 null值可能会出现。

所以,为了摆脱这些,我必须过滤掉那些,其中 ExecutionException出现:
stream.filter(future -> {
Integer i = null;
try {
i = future.get();
} catch (InterruptedException e) {
} catch (ExecutionException e) {
}
return i != null;
})
.map(future -> {
Integer i = null;
try {
i = future.get();
} catch (InterruptedException e) {
} catch (ExecutionException e) {
}
return i;
}).reduce(sum);

我认为,这段代码会起作用.. 但我不想相信,这是减少 Futures 的唯一也是最聪明的方法。

有什么想法或建议吗?

最佳答案

您可以先从 future 中提取值,然后过滤掉空值:

Integer result = stream
.map(future -> {
try {
return future.get();
} catch (InterruptedException | ExecutionException e) {
}
return null; })
.filter(Objects::nonNull)
.reduce(sum)
.orElse(0);

关于java - 如何减少 Java 中的 Futures 流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59789953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com