Как получить объект класса root в цикле потока - PullRequest
0 голосов
/ 27 марта 2020

У меня есть 3 класса. Мне нужен PostProcessorRequest, если vifLineItemResponse.isSuccess () имеет значение true. Как я могу получить PostProcessorRequest, если условие истинно в одном классе вложенного поля.

public class PostProcessorRequest {
    FulfillmentResponse response;
    SalesOrderDocument orderDocument;
    //Getters and setters 
}

public class FulfillmentResponse {
    Collection<VifLineItemResponse> responses;
    //Getters and setters 
}

public class VifLineItemResponse {
    VifLineItem vifLineItem;
    boolean isSuccess;
    // Getters and setters 
}

Способ, который я пробовал,

postProcessorRequest.getResponse()
                    .getResponses()
                    .stream()
                    .filter(match -> match.isSuccess())
                    .collect(Collectors.toList());

Но я получаю только FulfillmentResponse объект. Как я могу получить postProcessorRequest?

1 Ответ

1 голос
/ 27 марта 2020

Не совсем ясно, нужно ли вам проверять, является ли хотя бы один ответ успешным или все они успешны, но в любом случае вы, вероятно, захотите использовать Optional для объекта root вместо потоковой передачи конечных объектов:

Optional.of(postProcessorRequest)
        .filter(ppr->ppr.response!=null)
        .filter(ppr->ppr.response.responses.stream().anyMatch(VifLineItemResponse::isSuccess))
        .ifPresent(ppr-> {
            // ppr has at least one success response,
            // do with it whatever needs to be done
        })

Если вам нужно, чтобы все ответы были истинными, измените anyMatch на allMatch

Или вы можете изменить свои классы, чтобы иметь двунаправленные отношения, то есть что-то вроде это:

public class PostProcessorRequest {
    FulfillmentResponse response;
    SalesOrderDocument orderDocument;
    //Getters and setters 
}

public class FulfillmentResponse {
    Collection<VifLineItemResponse> responses;
    PostProcessorRequest getRequest(){ /* points back to parent */ }
    //Getters and setters 
}

public class VifLineItemResponse {
    VifLineItem vifLineItem;
    PostProcessorRequest getFulfillmentResponse(){ /* points back to parent */ }
    boolean isSuccess;
    // Getters and setters 
}

Теперь мы можем адаптировать ваш оригинальный код:

postProcessorRequest.getResponse()
                    .getResponses()
                    .stream()
                    .filter(match -> match.isSuccess())
                    .map(VifLineItemResponse::getFulfillmentResponse)
                    .map(FulfillmentResponse::getRequest)
                    .distinct()
                    .collect(Collectors.toList());
...