如何在不同的lambda表达式中使用来自lambda表达式的对象

时间:2019-06-13 07:58:23

标签: java lambda java-8

我有这个代码

service.confirm(identity, id)
                .map(confirmationResponse -> InternalToExternalResponse.mapToExternal(confirmationResponse))
                .map(externalResponse->uriBuilder.buildAuthorizeUri(externalResponse))
                .lift(auditOperatorFactory.logRequestURI(identity, AuditCategory.BOOKKEEP));

现在我需要扩展uriBuilder.buildAuthorizeUri(externalResponse)以将confirmationResponse作为第二个参数

我可以在第二个lambda表达式中使用第一个lambda表达式中的confirmationResponse吗?最终代码应类似于

service.confirm(identity, id)
                .map(confirmationResponse -> InternalToExternalResponse.mapToExternal(confirmationResponse))
                .map(externalResponse-**>uriBuilder.buildAuthorizeUri(externalResponse,confirmationResponse ))**
                .lift(auditOperatorFactory.logRequestURI(identity, AuditCategory.BOOKKEEP));

4 个答案:

答案 0 :(得分:4)

您可以组合两个lambda表达式:

service.confirm(identity, id)
                .map(confirmationResponse -> {
                    ExternalResponse externalResponse = InternalToExternalResponse.mapToExternal(confirmationResponse);
                    return uriBuilder.buildAuthorizeUri(externalResponse,confirmationResponse);})
                .lift(auditOperatorFactory.logRequestURI(identity, AuditCategory.BOOKKEEP));

尽管如此,我建议使用较短的lambda变量名称:

service.confirm(identity, id)
                .map(cr -> {
                    ExternalResponse er = InternalToExternalResponse.mapToExternal(cr);
                    return uriBuilder.buildAuthorizeUri(er,cr);})
                .lift(auditOperatorFactory.logRequestURI(identity, AuditCategory.BOOKKEEP));

答案 1 :(得分:4)

为什么不合并为一个lambda?

@EmbeddedId

答案 2 :(得分:1)

作为此结果,您可以将confirmationResponse传递给下一个lambda。由于两者都需要,因此可以创建自定义对象,也可以像这样使用Pair

service.confirm(identity, id)
                .map(confirmationResponse -> new Pair<ConfirmationResponse, ExternalResponse>(confirmationResponse, InternalToExternalResponse.mapToExternal(confirmationResponse)))
                .map(result ->u riBuilder.buildAuthorizeUri(result.second, result.first ))
                .lift(auditOperatorFactory.logRequestURI(identity, AuditCategory.BOOKKEEP));

答案 3 :(得分:1)

否,您不能在第二个lambda中使用confirmationResponse。那会破坏功能模式。

不过,您可以将其包括在第一个lambda的结果中。只需为自己创建一个Pair之类的实用程序类:

service.confirm(identity, id)
       .map(confirmationResponse -> Pair.of(
           InternalToExternalResponse.mapToExternal(confirmationResponse), 
           confirmationResponse))
       .map(p -> uriBuilder.buildAuthorizeUri(p.getFirst(), p.getSecond())
       ...

我不确定,如果这是好风格。