Не совсем ясно, нужно ли вам проверять, является ли хотя бы один ответ успешным или все они успешны, но в любом случае вы, вероятно, захотите использовать 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());