Привет.
Можно сделать так:
private void fillCvsColumnsValues(ExportOrderRequestDto request, ZoneId zoneId, DateTimeFormatter dateFormat,
CsvBuilder csvBuilder, PageDto<IndexedDraftOrderDto> searchOrders) {
ReportBuilder builder = new ReportBuilder(csvBuilder, request);
for (IndexedDraftOrderDto o : searchOrders.getContent()) {
builder.addNextColumnValue(ExportColumnEnum.ORDER_CODE, o::getOrderCode);
builder.addNextColumnValue(ExportColumnEnum.STATUS, () ->
nonNull(o.getOrderState()) ? ORDER_STATE_DESC.get(o.getOrderState()) : "");
builder.addNextColumnValue(ExportColumnEnum.CUSTOMER, () ->
nonNull(o.getCustomer()) ? o.getCustomer().getName() : "");
builder.addNextColumnValue(ExportColumnEnum.ANIMAL_COUNT, o::getNumberOfAnimals);
builder.addNextColumnValue(ExportColumnEnum.SAVED, () ->
formatDate(o.getSavedDate(), zoneId, dateFormat));
builder.addNextColumnValue(ExportColumnEnum.PRODUCT, () ->
ofNullable(o.getProducts()).orElse(Collections.emptyList()).stream()
.map(IndexedProductDto::getProductName)
.collect(Collectors.toList()));
builder.addNextColumnValue(ExportColumnEnum.MARKET, o::getMarket);
builder.endRow();
}
}
class ReportBuilder {
private CsvBuilder csvBuilder;
private ExportOrderRequestDto request;
public ReportBuilder(CsvBuilder csvBuilder, ExportOrderRequestDto request) {
this.csvBuilder = csvBuilder;
this.request = request;
}
public <T> void addNextColumnValue(ExportColumnEnum exportColumn, Supplier<T> supplier) {
if (request.getColumns().contains(exportColumn)) {
csvBuilder.addNextColumnValue(supplier.get());
}
}
public void endRow() {
csvBuilder.endRow();
}
}