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

3
我有这段代码。
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));

1
不可以。你可以在mapToExternal()方法的结果中设置confirmationResponse,或者将两个map混合到一个map操作中。 - Hadi J
你的.confirm().buildAuthorizeUri()方法的结果类型是什么? - Amadán
@Amadán,ConfirmationResponse和ExternalResponse - Melad Basilius
ConfirmationResponse.map() 函数是什么?它返回什么? - Amadán
4个回答

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

4
为什么不将多个lambda合并成一个?
service.confirm(identity, id)
       .map(confirmationResponse -> uriBuilder.buildAuthorizeUri(InternalToExternalResponse.mapToExternal(confirmationResponse), confirmationResponse))
       .lift(...)

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())
       ...

我不确定这是否是这里的良好风格。


1
您可以将confirmationResponse作为此Lambda函数的结果传递给下一个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));

所有其他答案都是正确的,但我选择了这个,因为我不想混淆 lambda 表达式。 - Melad Basilius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接