【问题标题】:Filtering a stream of CompletableFuture<SomeObject> on some attribute of SomeObject在 SomeObject 的某些属性上过滤 CompletableFuture<SomeObject> 流
【发布时间】: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&lt;List&lt;SomeObject&gt;&gt;Stream&lt;SomeObject&gt;,如果您不关心订单,可以使用我的 flattenStreamOfFutures()

标签: java java-stream completable-future


【解决方案1】:

如果您绝对必须保留返回类型,您可以在第二种方法中从 List&lt;SomeObject&gt; 映射回 List&lt;CompletableFuture&lt;SomeObject&gt;&gt;

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

请注意,这种方法仍然是阻塞的。获得畅通解决方案的一种简单方法是将您的第二种方法本身包装成CompletableFuture。但是,这也会影响返回类型并将其转换为CompletableFuture&lt;List&lt;SomeObject&gt;&gt;

【讨论】:

  • 这比stream.filter(f -&gt; f.join().getSomeAttribute().equals("SOMETHING")) .toList()好多少?
  • 不是更好,但它保留了原始返回类型,正如 OP 所希望的那样。
  • OP 的变体,仅使用 filter,已经保留了原始返回类型。我的变体仅将 get 替换为 join 以消除对冗长 try … catch … 语法的需要,但在其他方面是等效的,换句话说,也保留了原始返回类型。无需创建新的CompletableFuture 实例。
  • > 将 get 替换为 join 我错过了这个细微差别。可能值得将其作为强调这一点的答案。
【解决方案2】:

正如 cmets 中所指出的,这似乎是我正在寻找的方式:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 2011-11-07
    • 2013-07-23
    相关资源
    最近更新 更多