【发布时间】:2022-01-28 17:23:55
【问题描述】:
我有一个 SomeObject 的 CompletableFuture 流,我正在尝试对 SomeObject 的某些属性进行过滤,但我似乎找不到令人满意的过滤方式。
public class SomeObject {
private String someAttribute;
public String getSomeAttribute() {
return someAttribute;
}
}
我试过这个,但我想知道是否有非阻塞方式?
public List<CompletableFuture<SomeObject>> filterStream(Stream<CompletableFuture<SomeObject>> stream) {
return stream.filter(futureSomeObject -> {
try {
return futureSomeObject.get().getSomeAttribute().equals("SOMETHING");
} catch (InterruptedException | ExecutionException e) {
return false;
}
}).toList();
}
我也想过这样的事情,但我需要更改返回签名:
stream.map(CompletableFuture::join).filter(object -> object.getSomeAttribute().equals("SOMETHING")).toList();
【问题讨论】:
-
您已经可以使用
join()而不是get()来改进第一个解决方案,但是返回类型会限制您等待所有完成才能构建列表。我只能建议将返回类型更改为更有意义的类型,CompletableFuture<List<SomeObject>>或Stream<SomeObject>,如果您不关心订单,可以使用我的flattenStreamOfFutures()。
标签: java java-stream completable-future