Mapstruct:将对象列表映射到两个字符串/UUID 列表

ico*_*oba 2 mapstruct

我需要一个类的映射结构映射,该类具有要映射到目标类的对象列表,如下所示:

//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;
}
Run Code Online (Sandbox Code Playgroud)

Fil*_*lip 5

如果您定义可以在不同列表类型之间进行映射的方法,或者列表中的对象与其他对象之间的映射,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;
    }

}
Run Code Online (Sandbox Code Playgroud)

然后,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());
    }

}
Run Code Online (Sandbox Code Playgroud)

对于更高级的用法,您可以使用基于限定符的映射方法选择