用Java 8播放2.5错误-类型参数和lambda表达式的数量错误,此处不应出现错误



我正在尝试从Play 2.4升级到Play 2.5。使用"用Java 8的CompletionStage替换F.Promise"中的指南,我将F.PromisemapflatMap替换为上一个链接中建议的替换(反映了下面的更改片段)。

public CompletionStage<Result> parallel() {
final long start = System.currentTimeMillis();
final CompletionStage<WSResponse, Long> getLatency = resp -> System.currentTimeMillis() - start;
CompletionStage<Long> googleLatency = WS.url("http://google.com").get().thenApplyAsync(getLatency);
CompletionStage<Long> yahooLatency = WS.url("http://yahoo.com").get().thenApplyAsync(getLatency);
return googleLatency.thenComposeAsync(googleResponseTime ->
yahooLatency.thenApplyAsync(yahooResponseTime ->
ok(format("Google response time:  %d; Yahoo response time:  %d",
googleResponseTime, yahooResponseTime)))
);
}

运行./activator clean dist后,我得到以下错误:

[error]/Play-2-JS-2.5/app/controllers/Java8Controller.java:74:类型参数数量错误;必需1[error]CompletionStage[error]/Play-2-JS-2.5/app/controllers/Java8Controller.java:74:此处不需要lambda表达式[error]resp->System.currentTimeMillis()-启动

出于某种原因,它认为CompletionStage<WSResponse, Long> getLatency部分应该只有一个而不是两个,而且出于某种原因它不喜欢lambda表达式,尽管新api替换之前的语法在Play 2.4中成功运行。

我试着切换回中显示的旧呼叫https://github.com/btgrant-76/Play-2-Java-Scala-Java-8-Async-Comparison/blob/6a85cf31cfb804ef20bacf8e14d30ce46cc9307c/app/controllers/Java8Controller.java#L71-然而,L83并没有带来任何更好的结果。我在谷歌上搜索了一段时间,但不知道如何处理这个问题。任何有可能的例子的建议都将不胜感激。

更换

final CompletionStage<WSResponse, Long> getLatency = resp ->
System.currentTimeMillis() - start;

带有

final Function<WSResponse, Long> getLatency = resp -> System.currentTimeMillis() - start;

由于CompletionStage接口中的thenApplyAsyncmetod接受java.util.Function

希望这能有所帮助
祝好运