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
我需要一个 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