当前位置: 首页 > 知识库问答 >
问题:

基于内部值的CompletableFutures和筛选

阎安邦
2023-03-14

我现在有点困惑,所以我有一个方法应该返回CompletableFuture

里面的方法是:

CompletableFuture<List<String>> toReturn = asyncCall().thenApply(....)
.thenCompose(listOfStuff -> convertToList(listOfStuff.stream().map(
     key -> asyncCall2(key)
        .thenApply(optionalValue -> optionalValue.orElse(null))
).collect(Collectors.toList()));

转换ToList()简单地加入期货以转换CompletableFuture

基本上,我的目的是过滤从optionalValue中出现的空值。orElse(null)在最后一行中收集所有列表之前进行筛选是很容易的,但是如果我在之前使用它。collect(收集)它正在研究可完成的未来

我怀疑我可以在代码中进行很多重构。

编辑:

private<T> CompletableFuture<List<T>> convertToList(List<CompletableFuture<T>> toConvert) {
    return CompletableFuture.allOf(toConvert.toArray(new CompletableFuture[toConvert.size()]))
            .thenApply(v -> toConvert.stream()
                    .map(CompletableFuture::join)
                    .collect(Collectors.toList())
            );
}

共有1个答案

墨寂弦
2023-03-14

最好的方法可能是更改convertToList(),这样它就不会返回list的未来,而是流的未来:

private <T> CompletableFuture<Stream<T>> convertToFutureOfStream(List<CompletableFuture<T>> toConvert) {
    return CompletableFuture.allOf(toConvert.stream().toArray(CompletableFuture[]::new))
            .thenApply(
                    v -> toConvert.stream()
                            .map(CompletableFuture::join)
            );
}

这将更加可重用,因为该方法将允许更好的链接,并且不会强制调用方处理列表,同时仍然允许通过简单的收集轻松获取列表。

然后,您可以简单地过滤该流以删除空选项:

CompletableFuture<List<String>> toReturn = asyncCall()
    .thenCompose(listOfStuff -> convertToFutureOfStream(
            listOfStuff.stream()
                    .map(this::asyncCall2)
                    .collect(Collectors.toList())
        )
        .thenApply(stream ->
                stream.filter(Optional::isPresent)
                        .map(Optional::get)
                        .collect(Collectors.toList())
        )

    );

您甚至可以通过更改转换ToFutureOfStream()以将流作为参数来进一步改进这一点:

private <T> CompletableFuture<Stream<T>> convertToFutureOfStream(Stream<CompletableFuture<T>> stream) {
    CompletableFuture<T>[] futures = stream.toArray(CompletableFuture[]::new);
    return CompletableFuture.allOf(futures)
            .thenApply(v -> Arrays.stream(futures).map(CompletableFuture::join));
}

(不幸的是,由于泛型类型数组,这会引发未经检查的赋值警告)

这就给了

CompletableFuture<List<String>> toReturn = asyncCall()
    .thenCompose(listOfStuff -> convertToFutureOfStream(
                listOfStuff.stream().map(this::asyncCall2)
            )
        .thenApply(stream ->
                stream.filter(Optional::isPresent)
                        .map(Optional::get)
                        .collect(Collectors.toList())
        )

    );
 类似资料:
  • 我有一个像这样的熊猫数据框 我希望能够删除列列表中所有带负值的行,并使用NaN保存行。 在我的示例中,只有2列,但我的数据集中有更多的列,所以我无法逐个完成。

  • 我有两个数据帧df1和df2。 i、 e.df1的索引为天,df2的索引为日期时间。我想在索引上执行DF1和DF2的内部连接,这样如果DF2中对应于DF2的时间在DF1中可用,则我们认为内部连接为真,否则为假。 我想获得两个df11和df22作为输出. df11将有共同的日期和相应的列从df1. df22将有共同的日期小时和相应的列从df2. "例如df1中的"2002-08-04"和df2中的"

  • 我正在尝试用Angular 7建立一个动态研究。我正在用多个键从API中获取一个数组:[_id= 我用ngFor显示我所有的结果,我已经用我找到的教程创建了一个过滤管道… 这是我的研究部分: 这是我的过滤管功能: 但是这只会过滤这样的数组:[

  • 本文向大家介绍基于DFA的部门,包括了基于DFA的部门的使用技巧和注意事项,需要的朋友参考一下 确定性有限自动机(DFA)用于检查一个数字是否可被另一个数字k整除。如果不能整除,则此算法还将找到余数。 对于基于DFA的部门,首先,我们必须找到DFA的过渡表,使用该表,我们可以轻松找到答案。在DFA中,每个状态只有两个过渡0和1。 输入输出 算法 输入: 数字num和除数k。 输出:检查除数和余数。

  • 我正在用s设计异步调用。这是一个批处理调用,在这里我需要同时处理几个实体。在呼叫结束时,我必须收集关于每一个项目的处理状态的信息。 作为输入,我有这些实体的ID数组。这是一个复杂的实体,为了将一个实体编译成一个对象,我必须发出几个DAO调用。每个DAO方法都返回。 我将那些DAO调用链接起来,因为如果其中一个部分不存在,我将无法构造一个完整的对象。下面是我的代码段的样子: 问题是,由于链接的关系,

  • 我有一个带有键的HashMap,值是字符串。我想通过以字符串“locationid”开头的键值过滤HashMap,并将键中的值返回到字符串数组列表中。HashMap的填充方式如下: 我需要arraylist中的ORG_Id值。 我找不到可以将值放入字符串列表的位置。编译错误是它不识别values()方法。 更新还尝试将筛选后的Hashmap放入另一个Hashmap中,如下所示: 但得到的编译错误是