你的主要子句是
CompletableFuture<String> allGen = loadFile1().thenApply(params1 -> {
…
});
所以指定的函数应该返回一个String。但是你的代码试图返回一个CompletableFuture<String>,因为Stream.of(gen1, gen2) .map(CompletableFuture::join) .collect(joining(",")) 产生一个String,而你在return CompletableFuture .allOf(gen1, gen2) .thenApply(r -> …); 中使用了这个表达式
在泛型代码中出现此类类型不匹配的情况下,编译器错误消息通常非常无用。
最简单的解决方法(更改最小)是使用thenCompose 而不是thenAppy,允许函数返回CompletableFuture。
CompletableFuture<String> allGen = loadFile1().thenCompose(params1 -> {
CompletableFuture<String> gen1 = loadFile2().thenApply(params2 -> {
return generateResultFile1(params1, params2);
});
CompletableFuture<String> gen2 = loadFile3().thenApply(params3 -> {
return generateResultFile2(params1, params3);
});
return CompletableFuture.allOf(gen1, gen2)
.thenApply(r -> Stream.of(gen1, gen2)
.map(CompletableFuture::join).collect(joining(",")));
});
不过,也有使用简化语法的机会
CompletableFuture<String> allGen = loadFile1().thenCompose(params1 -> {
CompletableFuture<String> gen1 = loadFile2()
.thenApply(params2 -> generateResultFile1(params1, params2));
CompletableFuture<String> gen2 = loadFile3()
.thenApply(params3 -> generateResultFile2(params1, params3));
return CompletableFuture.allOf(gen1, gen2)
.thenApply(r -> Stream.of(gen1, gen2)
.map(CompletableFuture::join).collect(joining(",")));
});
如果代码总是正好组合两个结果,你可以使用更简单的:
CompletableFuture<String> allGen = loadFile1().thenCompose(params1 ->
loadFile2().thenApply(params2 -> generateResultFile1(params1, params2))
.thenCombine(
loadFile3().thenApply(params3 -> generateResultFile2(params1, params3)),
(s1, s2) -> String.join(",", s1, s2))
);
尽管嵌套不同,loadFile2().thenApply(…) 和 loadFile3().thenApply(…) 仍然是两个独立的操作,只有最终的 (s1, s2) -> String.join(",", s1, s2) 依赖于两者。
如果您想让这一点更明显,请保留局部变量
CompletableFuture<String> allGen = loadFile1().thenCompose(params1 -> {
CompletableFuture<String> gen1
= loadFile2().thenApply(params2 -> generateResultFile1(params1, params2));
CompletableFuture<String> gen2
= loadFile3().thenApply(params3 -> generateResultFile2(params1, params3));
return gen1.thenCombine(gen2, (s1, s2) -> s1 + "," + s2);
});
如上一个示例所示,您也可以在此处将String.join(",", s1, s2) 替换为s1 + "," + s2。后者的效率会稍高一些,但由于它不太可能主导整体性能,所以这只是一个品味问题。