Как я могу использовать объект из лямбда-выражения в другом лямбда-выражении - PullRequest
3 голосов
/ 13 июня 2019

У меня есть этот код

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

Теперь мне нужно расширить uriBuilder.buildAuthorizeUri(externalResponse), чтобы принять confirmationResponse в качестве второго параметра

Могу ли я использовать confirmationResponse из первого лямбда-выражения внутри второго лямбда-выражения? окончательный код должен быть как

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

Ответы [ 4 ]

4 голосов
/ 13 июня 2019

Почему бы не объединиться в одну лямбду?

service.confirm(identity, id)
       .map(confirmationResponse -> uriBuilder.buildAuthorizeUri(InternalToExternalResponse.mapToExternal(confirmationResponse), confirmationResponse))
       .lift(...)
4 голосов
/ 13 июня 2019

Вы можете объединить два лямбда-выражения:

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

Я бы предложил использовать более короткие имена лямбда-переменных, хотя:

service.confirm(identity, id)
                .map(cr -> {
                    ExternalResponse er = InternalToExternalResponse.mapToExternal(cr);
                    return uriBuilder.buildAuthorizeUri(er,cr);})
                .lift(auditOperatorFactory.logRequestURI(identity, AuditCategory.BOOKKEEP));
1 голос
/ 13 июня 2019

Нет, вы не можете использовать confirmationResponse во второй лямбде.Это нарушило бы функциональный паттерн.

Вы можете включить его в результат первой лямбды.Просто создайте себе служебный класс, такой как Pair:

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

Я не уверен, хотя, если это хороший стиль здесь.

1 голос
/ 13 июня 2019

Вы можете передать confirmationResponse следующей лямбде в результате этой.Поскольку вам нужно и то, и другое, вы можете создать собственный объект или использовать 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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...