我刚刚完成了一个使用Play 2.0和Java的原型,现在正在考虑学习Scala,这样我就可以切换到它进行进一步开发。
这不仅仅是通常的Java与Scala的讨论 - 我在Play框架中看到的问题是它迫使Scala习语进入Java。文档中有关调用多个 Web 服务的示例:
public static Result feedComments(String feedUrl) {
return async(
WS.url(feedUrl).get().flatMap(
new Function<WS.Response, Promise<Result>>() {
public Promise<Result> apply(WS.Response response) {
return WS.url(response.asJson().findPath("commentsUrl").get().map(
new Function<WS.Response, Result>() {
public Result apply(WS.Response response) {
return ok("Number of comments: " + response.asJson().findPath("count"));
}
}
);
}
}
)
);
}
它可以工作,但看起来不像传统的Java。这些括号看起来真的很可怕。甚至 Eclipse 也会感到困惑,从来不知道我需要或想要使用哪些泛型 - 我总是必须手动选择它们。
另请注意,在文档中,他们通过删除注释,仅使用两个空格进行缩进,并总体上选择一个非常简单的示例而无需验证或错误恢复,从而使这看起来很漂亮,因此他们不会使用太多行。我甚至不确定您是否可以配置代码格式化程序来像这样输出它而不会完全弄乱其他代码。@Override
在实践中,我最终得到了一个可怕的Java-Scala令人憎恶的不可读块,只是为了从另一个服务中获取一些数据。
不幸的是,我找不到任何在Scala中组合响应的例子。至少在Scala中调用单个Web服务看起来更短,更容易阅读。