使用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
作为其第二个参数。 -
传递给
exceptionally
的Function
应该使用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
。