使用CompletableFuture进行回调

我正在尝试使用一些字符串创建一个非常简单的回调。 IDE的代码意义是对特殊的未经检查的调用抱怨。 任何人都可以给我一个解决方案吗? 最后的想法是包装一个网络调用,以便返回承诺的结果,我可以根据需要添加其他function。

import java.util.concurrent.*; import java.util.function.BiConsumer; import java.util.function.Function; import java.util.function.Supplier; public class FuturesTest { public static void main(String[] args) throws Exception { new FuturesTest().go(); } private void go() throws ExecutionException, InterruptedException { CompletableFuture.supplyAsync(new MakesANetworkCall()) .whenComplete(new BiConsumer() { @Override public void accept(String result, String s) { System.out.println(result.toString()); } }) .exceptionally(new Function() { @Override public Exception apply(Exception e) { e.printStackTrace(); return e; } } ).thenApplyAsync(new Function() { @Override public String apply(String o) { System.out.println("Last action of all!"); return null; } }); System.out.println("Main thread will sleep"); Thread.sleep(2500); System.out.println("Program over"); } class MakesANetworkCall implements Supplier { @Override public String get() { try { System.out.println("Ground control to Major Tom"); Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } // int i = 2/0; return new String("Major Tom reporting!"); } } } 

首先,您的类MakesANetworkCall实现原始类型Supplier而不是Supplier 。 这将有效地禁用类型检查并隐藏您所做的所有错误,因此这不是您应该担心的单一警告,因为这不是代码中唯一的错误:

  • 传递给whenComplete应该能够使用Throwable作为其第二个参数。

  • 传递给exceptionallyFunction应该使用Throwable并返回替代结果。

此外,您正在使用表达式new CompletableFuture()作为其目标来调用static方法,并且您有一个过时的字符串创建表达式作为new String("Major Tom reporting!") ,其中简单常量"Major Tom reporting!" 会做。 通常,您似乎总是尝试使用不恰当的方法,即设计用于消耗您不使用的东西的方法,或者用于在没有方法的情况下提供值的方法。 考虑一下:

 CompletableFuture.supplyAsync(new MakesANetworkCall()) .thenAccept(result -> System.out.println(result)) .exceptionally(e -> { e.printStackTrace(); return null;}) .thenRun(()->System.out.println("Last action of all!")); 

这似乎是你的意图。 如果您确保您的MakesANetworkCall正确实现了Supplier ,则应该在没有任何警告的情况下进行编译。

您的核心问题是class MakesANetworkCall implements Supplier { 。 这是使用原始类型,因此隐藏了进一步的问题。 修复到class MakesANetworkCall implements Supplier {并修复所有后续问题,你得到:

  CompletableFuture.supplyAsync(new MakesANetworkCall()) // Not  .whenComplete(new BiConsumer() { @Override public void accept(String result, Throwable t) { System.out.println(result); } }) // Not  .exceptionally(new Function() { @Override public String apply(Throwable t) { t.printStackTrace(); // Must return a Streing return t.getMessage(); } } ).thenApplyAsync(new Function() { @Override public String apply(String o) { System.out.println("Last action of all!"); return null; } }); 

CompletableFuture.exceptionally声明如下:

 public CompletableFuture exceptionally(Function fn); 

你传递了一个Function ,而你应该传递一个Function