我现在有点困惑,所以我有一个方法应该返回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())
);
}
最好的方法可能是更改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中,如下所示: 但得到的编译错误是