- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
目前要使用 CompletionStage 的集合做一些简单的事情需要跳过几个难看的圈子:
public static CompletionStage<String> translate(String foo) {
// just example code to reproduce
return CompletableFuture.completedFuture("translated " + foo);
}
public static CompletionStage<List<String>> translateAllAsync(List<String> input) {
List<CompletableFuture<String>> tFutures = input.stream()
.map(s -> translate(s)
.toCompletableFuture())
.collect(Collectors.toList()); // cannot use toArray because of generics Arrays creation :-(
return CompletableFuture.allOf(tFutures.toArray(new CompletableFuture<?>[0])) // not using size() on purpose, see comments
.thenApply(nil -> tFutures.stream()
.map(f -> f.join())
.map(s -> s.toUpperCase())
.collect(Collectors.toList()));
}
public CompletionStage<List<String>> translateAllAsync(List<String> input) {
// allOf takes a collection< futures<X>>,
// and returns a future<collection<x>> for thenApply()
return XXXUtil.allOf(input.stream()
.map(s -> translate(s))
.collect(Collectors.toList()))
.thenApply(translations -> translations.stream()
.map(s -> s.toUpperCase())
.collect(Collectors.toList()));
}
Future<Collection<Future<X>>>
而不是
Future<Collection<X>>
在某些情况下也可能有用。
@Test
public void testTranslate() throws Exception {
List<String> list = translateAllAsync(Arrays.asList("foo", "bar")).toCompletableFuture().get();
Collections.sort(list);
assertEquals(list,
Arrays.asList("TRANSLATED BAR", "TRANSLATED FOO"));
}
最佳答案
我刚刚查看了CompletableFuture.allOf
的源代码,发现它基本上创建了一个节点的二叉树,一次处理两个阶段。我们可以在不使用 toCompletableFuture()
的情况下轻松实现类似的逻辑。显式并一次性处理结果列表生成:
public static <T> CompletionStage<List<T>> allOf(
Stream<? extends CompletionStage<? extends T>> source) {
return allOf(source.collect(Collectors.toList()));
}
public static <T> CompletionStage<List<T>> allOf(
List<? extends CompletionStage<? extends T>> source) {
int size = source.size();
if(size == 0) return CompletableFuture.completedFuture(Collections.emptyList());
List<T> result = new ArrayList<>(Collections.nCopies(size, null));
return allOf(source, result, 0, size-1).thenApply(x -> result);
}
private static <T> CompletionStage<Void> allOf(
List<? extends CompletionStage<? extends T>> source,
List<T> result, int from, int to) {
if(from < to) {
int mid = (from+to)>>>1;
return allOf(source, result, from, mid)
.thenCombine(allOf(source, result, mid+1, to), (x,y)->x);
}
return source.get(from).thenAccept(t -> result.set(from, t));
}
public static CompletionStage<List<String>> translateAllAsync(List<String> input) {
return allOf(input.stream().map(s -> translate(s)))
.thenApply(list -> list.stream()
.map(s -> s.toUpperCase())
.collect(Collectors.toList()));
}
public static CompletionStage<List<String>> translateAllAsync(List<String> input) {
return allOf(input.stream().map(s -> translate(s).thenApply(String::toUpperCase)));
}
@Test
public void testTranslate() throws Exception {
List<String> list = translateAllAsync(Arrays.asList("foo", "bar")).toCompletableFuture().get();
assertEquals(list, Arrays.asList("TRANSLATED FOO", "TRANSLATED BAR"));
}
关于java-8 - 如何使用 CompletionStage 的集合很好地执行 allOf/AnyOf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49934126/
我们有一个内部API,它在lambda中执行代码,并在CompleteStage中返回布尔结果:。现在,第二步也被实现为一个cpdec任务:。如何让Second Step()在foo2()中运行,并确
假设我有这个方法: public CompletionStage getData() { CompletableFuture future = new CompletableFuture<>(
就像这个使用 of 的假设示例一样: List> listOfFutureLongs = getFutureLongs(...) CompletionStage> futureListOfLongs
我有两个类(class);A 和 B;都返回 CompletionStage。 B 类代码: class B { public CompletionStage>> m1(SampleObjec
场景: 有两个阶段 第二阶段仅在第一阶段完成后执行 第二阶段对第一阶段的结果不感兴趣,而仅仅对第一阶段完成的事实感兴趣 考虑现有方法: public CompletionStage thenAppl
我正在尝试使用 java 8 CompletionStages 串行执行 2 个异步方法,以便在第一个失败时不执行第二个。但是当我调用 thenCompose 时,传入的函数似乎在前一个函数完成之前就
我有两个 completionStages 方法调用,如果不满足条件,每个方法调用一个远程服务。它们都是长时间运行的进程,我们需要减少延迟。我也不关心 secondFuture 的响应。它可以返回 C
在 exceptionally 内重新抛出异常似乎不允许使用 CompletionStage 方法。 我需要检查某种异常,如果没有,我需要重新抛出它: Future futureSite = some
CompletionStage Javadoc 指出: [...] if a stage's computation terminates abruptly with an (unchecked) e
这是我的方法: public CompletionStage insert(List hashActionList) { if(!hashActionList.isEmpty()) {
当调用从 Netty 处理程序内部返回 CompletionStage 的服务时,如何最好地处理异常。 我认为有两种类型的异常需要处理: 在被调用服务内部生成 CompletionStage 时发生的
所以考虑到我有以下示例: CompletionStage tokenFuture = getToken(); CompletionStage>>> result = tokenFuture.thenA
我试图在以下代码中找到更好的方法来处理多个异常: public CompletionStage getRepositoryInfo(String repositoryOwner, String rep
我正在用 Java 编写一个 Play2 应用程序服务方法,它应该执行以下操作。异步调用A方法,失败再异步调用B方法。 为了说明,假设此接口(interface)用于服务调用的后端: public i
CompletionStage Javadoc 指出: [...] if a stage's computation terminates abruptly with an (unchecked) e
我在它们每个中都看到了一个示例,但我需要确切地知道 deep 中的区别是什么,因为有时我认为我可以同时使用它们来获得相同的结果,所以我想知道以便我可以选择正确的? 使用它们各自有什么好处? 就像这个例
如果有 2 个 CompletionStages,我可以将它们与 thenCombine 方法结合起来: CompletionStage aCompletionStage = getA(); Comp
这个问题已经有答案了: CompletableFuture recoverWith equivalent? i.e. exceptionally but return CompletableFutur
在构建 API 时,对接口(interface)进行编码是一种很好的做法,因此返回 CompletionStage 似乎是一种最佳方法。但是我意识到,在获得 CompletionStage 之后,我碰
我遇到了一个问题,当方法返回 CompletionStage 时,我的过滤器运行了两次。从关于 RequestMapping ( here ) 的文档中,它是受支持的返回值。 A Completion
我是一名优秀的程序员,十分优秀!