Java流-将模型映射到实体-一对多转换



我正在尝试使用map()操作将模型TradeValidationData映射到实体TradeValidatioEntity

以下是型号:

@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class TradeValidationData {
@JsonProperty("orderId")
public Integer orderId;

@JsonProperty("tradeValidations")
public List<TradeValidation> tradeValidations;
}
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class TradeValidation {
@JsonProperty("clientReferenceId")
public String clientReferenceId;

@JsonProperty("tradeValidationMessages")
public List<TradeValidationMessage> tradeValidationMessages;
}
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class TradeValidationMessage {
@JsonProperty("validationCode")
public Integer validationCode;

@JsonProperty("validationMessage")
public String validationMessage;
}

这是实体:

public class TradeValidationEntity implements Serializable {

private static final long serialVersionId = 1L;

@EmbeddedId
private TradeValidationCompositeKey tradeValidationCompositeKey;

@Column(name = "validation_message")
private String validationMessage;
}
public class TradeValidationCompositeKey implements Serializable {
private static final long serialVersionId = 1L;

@Column(name = "order_id")
private Integer orderId;

@Column(name = "client_reference_id")
private String clientReferenceId;

@Column(name = "function_type_id")
private Integer functionTypeId;

@Column(name = "validation_id")
private Integer validationId;
}

我有一个模型对象TradeValidationData,它又有一个List<TradeValidation>。我需要将每个模型TradeValidation转换为一个实体TradeValidationEntity

每个TradeValidation都包含消息List<TradeValidationMessage>的列表。

为了初始化TradeValidationEntity,我需要创建一个复合密钥TradeValidationCompositeKey,它需要来自TradeValidation实例的数据和消息

这是我以前使用Stream.forEach()的代码,它运行良好。我希望这将有助于传达我的意图。

var tradeValidationEntities = new ArrayList<TradeValidationEntity>();
tradeValidationData.tradeValidations.stream().forEach(tradeValidation -> {
tradeValidation.tradeValidationMessages.stream().forEach(tradeValidationMessage -> {
var tradeValidationCompositeKey = new TradeValidationCompositeKey(orderId,
tradeValidation.clientReferenceId, functionTypeId, tradeValidationMessage.getValidationCode());

TradeValidationEntity tradeValidationEntity = new TradeValidationEntity();
tradeValidationEntity.setTradeValidationCompositeKey(tradeValidationCompositeKey);
tradeValidationEntity.setValidationMessage(tradeValidationMessage.validationMessage);

tradeValidationEntities.add(tradeValidationEntity);
});
});

以下是当前将TradeValidationData映射到TradeValidatioEntity的有问题的尝试:

List<TradeValidationEntity> tradeValidationEntities = tradeValidationData.tradeValidations.stream()
.map(tradeValidation -> {
var tradeValidationEntity = new TradeValidationEntity();
tradeValidation.tradeValidationMessages.stream()
.map(tradeValidationMessage -> {
var tradeValidationCompositeKey = new TradeValidationCompositeKey();
tradeValidationCompositeKey.setOrderId(orderId);
tradeValidationCompositeKey.setClientReferenceId(tradeValidation.clientReferenceId);
tradeValidationCompositeKey.setFunctionTypeId(functionTypeId);
tradeValidationCompositeKey.setValidationId(tradeValidationMessage.validationId);
tradeValidationEntity.setTradeValidationCompositeKey(tradeValidationCompositeKey);
tradeValidationEntity.setValidationMessage(tradeValidationMessage.getValidationMessage());
return tradeValidationEntity;
});
return tradeValidationEntity;
})
.collect(Collectors.toList());

我认为问题出在我对tradeValidationEntity的第二个返回语句上。但我不确定该返回什么。

您需要将流中的每个TradeValidation对象转换为多个TradeValidationEntity实例。

map()操作是而不是用于此目的的正确工具,它用于一对一转换。其函数获取一个对象,并且只生成一个对象。

要执行一对多转换,可以使用flatMap()操作。它需要一个函数,该函数接受一个元素并生成元素流

这就是它的实施方式。

List<TradeValidationEntity> tradeValidationEntities = tradeValidationData.tradeValidations.stream()
.flatMap(tradeValidation -> tradeValidation.tradeValidationMessages.stream()
.map(tradeValidationMessage -> {
var tradeValidationCompositeKey = new TradeValidationCompositeKey(orderId,
tradeValidation.clientReferenceId, functionTypeId, tradeValidationMessage.getValidationCode());

TradeValidationEntity tradeValidationEntity = new TradeValidationEntity();
tradeValidationEntity.setTradeValidationCompositeKey(tradeValidationCompositeKey);
tradeValidationEntity.setValidationMessage(tradeValidationMessage.validationMessage);

return tradeValidationEntity;
})
)
.toList(); // for Java 16+ or collect(Collectors.toList())

注意:

  • map()-是中间运算,它不会产生结果,而是生成另一个流
  • 不以终端操作结束的流将不会被执行(除非它被另一个流通过一些操作(如concat()flatMap()(消耗(
  • 多行lambda表达式很难读取。可读性和简洁性是流的主要武器。我建议考虑将函数中的重逻辑提取到一个具有不言自明名称的单独方法中,并将多行lambda替换为方法引用

最新更新