Optional<BulkResult> (BulkResultType bulkResultType) { final LocalDateTime documentDateTime = Optional.ofNullable(bulkResultType) .map(BulkResultType::getObservationBulkmailHeader) .map(HeaderType::getDocumentDateTime) .orElseThrow(() -> new InvalidMessageException("")); final Optional<LocalDateTime> reportedDateTime = Optional.ofNullable(bulkResultType) .map(BulkResultType::getObservationBulkmailHeader) .map(bulkResultHeaderType::getResultReleaseTime) .map(ResultReleaseTimeType::getReportedDateTime); final Optional<LocalDateTime> lastModificationDateTime = Optional.ofNullable(bulkResultType) .map(BulkResultType::getObservationBulkmailHeader) .map(HeaderType::getLastModificationDateTime); final Optional<String> statusCode =Optional.ofNullable(bulkResultType) .map(BulkResultType::getObservationBulkmailHeader) .map(bulkResultHeaderType::getStatus) .flatMap(statusTypes -> statusTypes.stream().findFirst()) .map(StatusBasisType::getCode) .map(CodeType::getValue); return Optional.ofNullable(bulkResultType) .flatMap(obm -> obm.getObservationBulkmailResult().stream().findFirst()) .map(obmResult -> BulkResult.builder() .consignmentId(getConsignmentId(obmResult.getConsignmentID())) .documentDateTime(documentDateTime) .reportedDateTime(reportedDateTime) .lastModificationDateTime(lastModificationDateTime) .customerOrderId(Optional.ofNullable(obmResult.getCustomerOrderID()).map(IdentifierType::getValue)) .orderLineNumber(Optional.ofNullable(obmResult.getOrderLineNumber()).map(IdentifierType::getValue)) .startDateTime(Optional.ofNullable(obmResult.getResultTime()).map(TimePeriodABIEType::getStartDateTime)) .endDateTime(Optional.ofNullable(obmResult.getResultTime()).map(TimePeriodABIEType::getEndDateTime)) .statusCode(statusCode) .build()); }