Play Java中的累积器地图方法?

时间:2017-01-27 11:13:27

标签: java playframework

在Play Java的the official documentation中,我看到了这段代码。

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);

}

我不明白mapresultOrJson是什么?

虽然实例Accumulator<ByteString, F.Either<Result, JsonNode>>不应该有这样的方法,但我应该解释什么呢。另外,resultOrJson突然出现,这让我感到困惑。 任何人都可以解释一下这段代码吗?

1 个答案:

答案 0 :(得分:0)

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条目流的map()。它的作用是基本上遍历累加器中的每个ByteString,并将{{1>}值中的JsonNode对象(如果存在)映射到User值并将其存储在新映射中。 / p>