【发布时间】:2018-12-07 07:59:44
【问题描述】:
我有一个用例,我想根据对元素执行的网络调用过滤掉列表中的几个元素。为此,我使用了流、过滤器和 Completable Future。目标是进行异步执行,以使操作变得高效。下面提到了这个的伪代码。
public List<Integer> afterFilteringList(List<Integer> initialList){
List<Integer> afterFilteringList =initialList.stream().filter(element -> {
boolean valid = true;
try{
valid = makeNetworkCallAndCheck().get();
} catch (Exception e) {
}
return valid;
}).collect(Collectors.toList());
return afterFilteringList;
}
public CompletableFuture<Boolean> makeNetworkCallAndCheck(Integer value){
return CompletableFuture.completedFuture(resultOfNetWorkCall(value);
}
我在这里遇到的问题是,我是否以异步方式本身执行此操作?(当我在过滤器中使用“get”函数时,它会阻止执行并使其仅按顺序执行)或者是否有使用 Java 8 中的 Completable Future 和 Filters 以异步方式执行此操作的更好方法。
【问题讨论】:
-
您忘记将
element传递给makeNetworkCallAndCheck。此外,例外情况被认为是“有效的”,这看起来很奇怪。 -
@Holger 标题与我认为的实际问题不匹配。 我自己是否以异步方式执行此操作? ...恕我直言,调用不是异步的,gets会阻塞...想法?
-
@nullpointer 好吧,调用
get()会立即破坏异步执行的好处,毫无疑问,但我不知道,鉴于此代码,该建议作为解决方案。例如。输入List<Integer>在流操作期间神奇地变为List<Long>,最终以List<Integer>返回。我想,它应该一直是相同的Integer对象,但我不想基于假设编写代码……
标签: java lambda java-8 completable-future