java8-process元素列表

qnzebej0  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(260)

请在下面找到我的实际代码的一个虚构的例子。这个例子过于简单化了,无法解释我想要达到的目的。

public class TestClass {

ForkJoinPool forkJoinPool = new ForkJoinPool(3);

@Test 
public void testSample(){
    List<String> testStrings = Arrays.asList("Hello", "World", "Cobra", "Eagle", "Sam");

    //This doesn't compile
    List<CompletableFuture<Double>> result =
            testStrings.stream().map(each -> CompletableFuture.supplyAsync(() -> getIndividualCharacters(each), forkJoinPool)
                    .thenComposeAsync(listOfChars -> listOfChars.stream()
                            .map(character -> CompletableFuture.supplyAsync(() -> getDoubleString(character)))
                            .collect(Collectors.toList())));

}

public List<String> getIndividualCharacters(String name){
    List<String> result = new ArrayList<>();
    for(int i =0; i < name.length(); i++){
        result.add(Character.toString(name.charAt(i)));
    }
    return result;
}

public Double getDoubleString(String singleCharacter){
    return Math.random();
}

}
我的 getIndividualCharacters 方法返回结果列表(异步)。我使用单个结果并进一步处理它以返回另一个结果(异步)。我想要的最终结果是 List<Completeable<final result>> 在这种情况下 List<Completeable<Double>> 我可以在里面用 CompleteablFuture.allOf 如果可能的话,我想使用完全未来的链接。我还没有找到一个办法,也没有任何例子提到它。任何关于如何实现这一点的帮助或指点都将非常有用。
ps:我已经用两个独立的completablefuture流解决了这个问题,但是,我想使用链接 thenCompose ```
List testStrings = Arrays.asList("Hello", "World", "Cobra", "Eagle", "Sam");
List<CompletableFuture<List>> firstResult = testStrings.stream()
.map(each -> CompletableFuture.supplyAsync(() -> getIndividualCharacters(each), forkJoinPool))
.collect(Collectors.toList());
CompletableFuture.allOf(firstResult.toArray(new CompletableFuture[firstResult.size()])).join();
List<CompletableFuture> secondResult = firstResult.stream()
.flatMap(res -> res.join().stream())
.map(ea -> CompletableFuture.supplyAsync(() -> getDoubleString(ea), forkJoinPool))
.collect(Collectors.toList());
List finalResult = secondResult.stream().map(res-> res.join()).collect(Collectors.toList());
System.out.println("finalResult " + finalResult);

当做。
4xrmg8kj

4xrmg8kj1#

我猜是这样的?

List<CompletableFuture<Double>> result =
  testStrings.stream()
             .map(x -> CompletableFuture.supplyAsync(() -> getIndividualCharacters(x)))
             .map(x -> x.thenApplyAsync(y -> y.stream().map(z -> CompletableFuture.supplyAsync(() -> getDoubleString(z)))))
             .flatMap(CompletableFuture::join)
             .collect(toList());

请注意,这将阻止,因为 join .

相关问题