Mapstruct:将对象列表映射到两个 Strings/UUIDs 列表

Mapstruct: Mapping a List of Objects into two lists of Strings/UUIDs

我需要一个 class 的 mapstruct 映射,它有一个要映射到目标 class 的对象列表,这样:

//Source class:
public class VoucherTransaction {
    private List<Voucher> vouchers;
}

//TargetClass
public class VoucherTransactionServiceDTO {
    private List<UUID> voucherIds;
    private List<String> voucherSerials;
}

public class Voucher {
    private UUID id;
    private String serial;
}

在您的映射器 class 中,您可以为每个目标使用表达式,并为目标中的每个列表实现单独的默认映射。

@Mapping(target = "voucherIds", expression = "java( mapVoucherListToVoucherIdList(transaction.getVouchers()) )")
@Mapping(target = "voucherSerials", expression = "java( mapVoucherListToVoucherSerialList(transaction.getVouchers()) )")
public VoucherTransactionServiceDTO TransactionToServiceDTO(VoucherTransaction transaction);

default List<UUID> mapVoucherListToVoucherIdList(List<Voucher> vouchers) {
    List<UUID> voucherIds = new ArrayList<>();
    if (vouchers != null && !vouchers.isEmpty())
        voucherIds = vouchers.stream().map(Voucher::getId).collect(Collectors.toList());
    return voucherIds;
}

default List<String> mapVoucherListToVoucherSerialList(List<Voucher> vouchers) {
    List<String> voucherSerials = new ArrayList<>();
    if (vouchers != null && !vouchers.isEmpty())
        voucherSerials = vouchers.stream().map(Voucher::getSerial).collect(Collectors.toList());
    return voucherSerials;
}

如果您定义的方法可以在不同的列表类型之间进行映射,或者列表的对象与其他对象 mapstruct 将识别它们并进行映射。

例如

@Mapper
public interface VoucherTransactionMapper {

    @Mapping(target = "voucherIds", source = "vouchers")
    @Mapping(target = "voucherSerials", source = "vouchers")
    public VoucherTransactionServiceDTO map(VoucherTransaction transaction);

    default UUID voucherToUuid(Voucher voucher) {
        return voucher != null ? voucher.getId() : null;
    }


    default String voucherToSerial(Voucher voucher) {
        return voucher != null ? voucher.getSerial() : null;
    }

}

MapStruct 将生成 List<Voucher>List<UUID> 以及 List<Voucher>List<String> 之间的映射,并使用映射器中定义的默认方法来执行映射。

您还可以定义列表映射方法,MapStruct 将使用它们代替:

例如

@Mapper
public interface VoucherTransactionMapper {

    @Mapping(target = "voucherIds", source = "vouchers")
    @Mapping(target = "voucherSerials", source = "vouchers")
    public VoucherTransactionServiceDTO map(VoucherTransaction transaction);

    default List<UUID> vouchersToUuids(List<Voucher> vouchers) {
        if (vouchers == null) {
            return null;
        }

        return vouchers.stream().map(Voucher::getId).collect(Collectors.toList());
    }


    default List<UUID> vouchersToSerials(List<Voucher> vouchers) {
        if (vouchers == null) {
            return null;
        }

        return vouchers.stream().map(Voucher::getSerial).collect(Collectors.toList());
    }

}

对于更高级的用法,您可以使用 Mapping method selection based on qualifiers