在Play Java的官方文档中,我看到了这段代码。
public Accumulator<ByteString, F.Either<Result, User>> apply(RequestHeader request) {
Accumulator<ByteString, F.Either<Result, JsonNode>> jsonAccumulator = jsonParser.apply(request);
return jsonAccumulator.map(resultOrJson -> {
if (resultOrJson.left.isPresent()) {
return F.Either.Left(resultOrJson.left.get());
} else {
JsonNode json = resultOrJson.right.get();
try {
User user = play.libs.Json.fromJson(json, User.class);
return F.Either.Right(user);
} catch (Exception e) {
return F.Either.Left(Results.badRequest(
"Unable to read User from json: " + e.getMessage()));
}
}
}, executor);
}
我不明白什么是map
和resultOrJson
?
尽管实例Accumulator<ByteString, F.Either<Result, JsonNode>>
不应该有这样的方法,我应该怎么解释。此外,resultOrJson
突然出现,这让我感到困惑。谁能解释这个代码?
Accumulator 类有一个 map() 函数,可与 Java 8 的 Stream#map 相媲美:
https://www.playframework.com/documentation/2.5.9/api/java/play/libs/streams/Accumulator.html#map-java.util.function.Function-java.util.concurrent.Executor-
在当前上下文中,resultOrJson 变量表示一个F.Either
对象,它是 lambda 函数的一部分。如果你不熟悉lambdas,我建议你阅读一下:
https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html
该功能类似于应用于映射条目流的 map()。它的作用是遍历累加器中的每个 ByteString,并将 F.Either
值中的 JsonNode 对象(如果存在)映射到 User 值并将其存储在新映射中。