我正在尝试从 Play 2.4 升级到 Play 2.5。使用 Replaced F.Promise with Java 8's CompletionStage 中的指南,我替换了F.Promise
, map
,和flatMap
使用上一个链接中建议的替换(下面反射(reflect)了更改的片段)。
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: wrong number of type arguments; required 1 [error] CompletionStage [error] /Play-2-JS-2.5/app/controllers/Java8Controller.java:74: lambda expression not expected here [error] resp -> System.currentTimeMillis() - start
出于某种原因,它认为 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
接口(interface)中的 thenApplyAsync
方法接受 java.util.Function
希望这有帮助。
祝你好运
关于java-8 - Play 2.5 Java 8 错误 - 错误数量的类型参数和此处不需要的 lambda 表达式错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41581697/