mapstruct 上有一个映射器,它根据票证的类型调用不同的 map 方法,所有这些都是通过 if else 条件实现的。我试图在策略模式或类似的东西上重写它,但在这种情况下,某些东西不会一直收敛。
// Хотелось бы как-то на месте инициализировать список условий
Map<Set<TicketType>, Function<TicketRequestDto, Ticket>> ticketMapStrategies = new ConcurrentHashMap<>(
... Как-то наполнить на месте, но как? ...
);
default Ticket ticketRequestDtoToTicket(TicketRequestDto dto) {
TicketType type = dto.getType();
if (type.equals(TicketType.EMERGENCY_STOP) || type.equals(TicketType.SETTING_UPLOAD)
|| dto.getType().equals(TicketType.SETTING_DOWNLOAD)) {
return ticketEmergencyStopRequestDtoToTicket(dto);
} else if (type.equals(TicketType.DEPOSIT_INCOME) || type.equals(TicketType.DEPOSIT_OUTCOME)) {
return ticketAccountTransferRequestDtoToTicket(dto);
} else if (type.equals(TicketType.PARTNER_REQUEST)) {
return ticketPartnershipRequestDtoToTicket(dto);
} else {
return ticketInfoRequestDtoToTicket(dto);
}
}
@Mapping(target = "instance.id", source = "instanceId")
@Mapping(target = "recipient.id", source = "recipientId")
Ticket ticketEmergencyStopRequestDtoToTicket(TicketRequestDto dto);
@Mapping(target = "account.id", source = "accountId")
@Mapping(target = "recipient.id", source = "recipientId")
Ticket ticketAccountTransferRequestDtoToTicket(TicketRequestDto dto);
@Mapping(target = "sender.id", source = "senderId")
@Mapping(target = "recipient.id", source = "recipientId")
Ticket ticketPartnershipRequestDtoToTicket(TicketRequestDto dto);
Ticket ticketInfoRequestDtoToTicket(TicketRequestDto dto);
我想以某种方式在现场初始化条件列表,然后ticketRequestDtoToTicket按键获取。就像是:
Set<TicketType> key = ticketMapStrategies.keySet().stream()
.filter(set -> set.contains(dto.getType()))
.findFirst()
.orElse(new HashSet<>());
return ticketMapStrategies.get(key).apply(dto);
如果可能的话,或者更紧凑的东西。
嗯,或者类似的东西。鉴于所有这些都发生在接口中,如何实现这一点?
爪哇 11
只要有我,
ConcurrentHashMap你就不需要——你不要在几个线程中添加到地图中。它可以是这样的(如果 java11+)
如果你有java8,那么你可以就地初始化
如果 guava 连接到项目,那么 ImmutableMap 可以在那里使用:
PS 一般来说,这里其实不需要map作为结构体——我们从不调用
.get()map上的方法=>这里不需要map作为结构体。它可以很容易地替换为对列表 (List<Pair<Set<TicketType>, Function<TicketRequestDto, Ticket>>>)到目前为止,我发现的最可接受的选择是使用
@PostConstruct并填写其中的地图。