在 SomeObject 的某些属性上过滤 CompletableFuture<SomeObject> 流

Filtering a stream of CompletableFuture<SomeObject> on some attribute of SomeObject

我有一个 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();
  }

我也想到了类似的东西,但我需要更改 return 签名:

stream.map(CompletableFuture::join).filter(object -> object.getSomeAttribute().equals("SOMETHING")).toList();

如果您绝对必须保留 return 类型,您可以在第二种方法中从 List<SomeObject> 映射回 List<CompletableFuture<SomeObject>>

stream
    .map(CompletableFuture::join)
    .filter(object -> object.getSomeAttribute().equals("SOMETHING"))
    .map(CompletableFuture::completedFuture)
    .toList();

请注意,此方法仍然是阻塞的。获得无阻塞解决方案的一种简单方法是将您的第二种方法本身包装到 CompletableFuture 中。然而,这也会影响 return 类型并将其变成 CompletableFuture<List<SomeObject>>.

正如评论中指出的那样,这似乎是我一直在寻找的方式:

public List<CompletableFuture<SomeObject>> filterStream(Stream<CompletableFuture<SomeObject>> stream) {
   return stream.filter(f -> f.join().getSomeAttribute().equals("SOMETHING")) .toList()
}