java—生成泛型列表的“composablefuture”的“allof”的泛型版本

6tr1vspr  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(293)

我在努力理解 CompletableFuture api,我被困在下面的问题。 allOf 本身只返回 CompletableFuture<void> ,因此只有稍微好一点的接口和一个名为 allResultsOf :此类函数应为泛型,并作为类型的参数对象接收 List<CompletableFuture<T>> 并返回类型为 CompletableFuture<List<T>> 我在函数声明中的尝试是:

  1. public static CompletableFuture<List<T>> allResultsOf(List<CompletableFuture<T>> completableFutures) {
  2. CompletableFuture<Void> allFutures = CompletableFuture
  3. .allOf(completableFutures.toArray(new CompletableFuture[completableFutures.size()]));
  4. CompletableFuture<List<T>> allCompletableFuture = allFutures.thenApply(
  5. future -> {
  6. return completableFutures.stream()
  7. .map(completableFuture -> completableFuture.join())
  8. .collect(Collectors.toList());
  9. });
  10. return allCompletableFuture;
  11. }

但是,在我(附件)的示例代码段中,此函数会产生以下编译错误:
错误:不兼容的类型:list<completablefuture<test.greetholder>>无法转换为list<completablefuture<?>>completablefutureallcompletablefuture=allresultsof(completablefutures);
我不确定这里有什么问题
示例代码(摘自此处):

  1. import java.util.*;
  2. import java.util.stream.*;
  3. import java.lang.*;
  4. import java.io.*;
  5. import java.util.concurrent.*;
  6. // The main method must be in a class named "Main".
  7. class Main {
  8. static class Test {
  9. private ExecutorService executor;
  10. public Test(ExecutorService es) {
  11. executor = es;
  12. }
  13. public class GreetHolder {
  14. private String greet;
  15. public GreetHolder(String greet) {
  16. this.greet = greet;
  17. }
  18. public String getGreet() {
  19. return greet;
  20. }
  21. public void setGreet(String greet) {
  22. this.greet = greet;
  23. }
  24. public String toString() {
  25. return getGreet();
  26. }
  27. }
  28. private CompletableFuture<GreetHolder> getGreeting(String lang) {
  29. return CompletableFuture.supplyAsync( () -> {
  30. try {
  31. System.out.println("Task execution started for lang =" + lang);
  32. Thread.sleep(200);
  33. System.out.println("Task execution stopped for lang =" + lang);
  34. } catch (InterruptedException e) {
  35. e.printStackTrace();
  36. }
  37. return new GreetHolder(getGreet(lang));
  38. }, executor);
  39. }
  40. public String getGreet(String lang) {
  41. if (lang.equals("EN")) {
  42. return "Hello";
  43. } else if (lang.equals("ES")) {
  44. return "Hola";
  45. } else if (lang.equals("SN")) {
  46. return "Ayubovan";
  47. } else {
  48. throw new IllegalArgumentException("Invalid lang param");
  49. }
  50. }
  51. public CompletableFuture<List<Test.GreetHolder>> run() {
  52. List<String> langList = Arrays.asList("EN", "ES", "SN"); //, "EX");
  53. List<CompletableFuture<Test.GreetHolder>> completableFutures =
  54. langList.stream().map(lang -> getGreeting(lang))
  55. //.map(CompletableFuture::join);
  56. .collect(Collectors.toList());
  57. // return completableFutures;
  58. CompletableFuture<Void> allFutures = CompletableFuture
  59. .allOf(completableFutures.toArray(new CompletableFuture[completableFutures.size()]));
  60. CompletableFuture<List<GreetHolder>> allCompletableFuture = allFutures.thenApply(
  61. future -> {
  62. System.out.println(String.format("%s <- future", future));
  63. return completableFutures.stream()
  64. .map(completableFuture -> completableFuture.join())
  65. .collect(Collectors.toList());
  66. });
  67. System.out.println(String.format("%s <- allCompletableFuture", allCompletableFuture));
  68. //return allCompletableFuture;
  69. CompletableFuture completableFuture = allCompletableFuture.thenApply(
  70. greets -> {
  71. return greets
  72. .stream()
  73. .map(GreetHolder::getGreet)
  74. .collect(Collectors.toList());
  75. });
  76. return completableFuture;
  77. }
  78. public static CompletableFuture<List<T>> allResultsOf(List<CompletableFuture<T>> completableFutures) {
  79. CompletableFuture<Void> allFutures = CompletableFuture
  80. .allOf(completableFutures.toArray(new CompletableFuture[completableFutures.size()]));
  81. CompletableFuture<List<T>> allCompletableFuture = allFutures.thenApply(
  82. future -> {
  83. System.out.println(String.format("%s <- future", future));
  84. return completableFutures.stream()
  85. .map(completableFuture -> completableFuture.join())
  86. .collect(Collectors.toList());
  87. });
  88. return allCompletableFuture;
  89. }
  90. public CompletableFuture<List<Test.GreetHolder>> run_tidier() {
  91. List<String> langList = Arrays.asList("EN", "ES", "SN"); //, "EX");
  92. List<CompletableFuture<Test.GreetHolder>> completableFutures =
  93. langList.stream().map(lang -> getGreeting(lang))
  94. //.map(CompletableFuture::join);
  95. .collect(Collectors.toList());
  96. CompletableFuture<List<GreetHolder>> allCompletableFuture = allResultsOf(completableFutures);
  97. System.out.println(String.format("%s <- allCompletableFuture", allCompletableFuture));
  98. CompletableFuture completableFuture = allCompletableFuture.thenApply(
  99. greets -> {
  100. return greets
  101. .stream()
  102. .map(GreetHolder::getGreet)
  103. .collect(Collectors.toList());
  104. });
  105. return completableFuture;
  106. }
  107. }
  108. public static void main(String[] args) throws InterruptedException, ExecutionException {
  109. ExecutorService pool = Executors.newFixedThreadPool(2);
  110. Test t = new Test(pool);
  111. System.out.println(String.format("%s world!", t.getGreet("EN")));
  112. CompletableFuture cf = t.run();
  113. System.out.println(String.format("%s <- cf", cf.get()));
  114. }
  115. }
inn6fuwd

inn6fuwd1#

正如matt timmermans所建议的,您需要一个类型变量。
改变 allResultsOf 为此编译:

  1. public static <T> CompletableFuture<List<T>> allResultsOf(List<CompletableFuture<T>> completableFutures) {
  2. CompletableFuture<Void> allFutures = CompletableFuture
  3. .allOf(completableFutures.toArray(new CompletableFuture[completableFutures.size()]));
  4. CompletableFuture<List<T>> allCompletableFuture = allFutures.thenApply(
  5. future -> {
  6. System.out.println(String.format("%s <- future", future));
  7. return completableFutures.stream()
  8. .map(completableFuture -> completableFuture.join())
  9. .collect(Collectors.toList());
  10. });
  11. return allCompletableFuture;
  12. }

相关问题