我试图将一些for-loops重构为lambda表达式,其中大多数都正常工作,但我正在为包含两个if语句的for-loop而努力。Java 8 Lambda Stream forEach带有两个if语句
代码
for (B2KTransactionDTO b2kTransactionDTO : result) {
//Generate loyaltyMatchId based on transaction input
String loyaltyMatchId = getLoyaltyMatchIdBasedOnTransactionDTO(b2kTransactionDTO);
if (loyaltyMatchIdAmountMap.containsKey(loyaltyMatchId)) {
BigDecimal cashback = loyaltyMatchIdAmountMap.get(loyaltyMatchId);
b2kTransactionDTO.addLoyaltyPoints(cashback);
}
String loyaltyMatchInsuranceId = getLoyaltyMatchInsuranceIdBasedOnTransactionDTO(b2kTransactionDTO);
if (loyaltyMatchInsuranceIdAmountMap.containsKey(loyaltyMatchInsuranceId)) {
BigDecimal cashback = loyaltyMatchInsuranceIdAmountMap.get(loyaltyMatchInsuranceId);
b2kTransactionDTO.addLoyaltyPoints(cashback);
}
}
我重构这下面的代码:
result.forEach(b2kTransactionDTO -> {
//Generate loyaltyMatchId based on transaction input
String loyaltyMatchId = getLoyaltyMatchIdBasedOnTransactionDTO(b2kTransactionDTO);
if (loyaltyMatchIdAmountMap.containsKey(loyaltyMatchId)) {
BigDecimal cashback = loyaltyMatchIdAmountMap.get(loyaltyMatchId);
b2kTransactionDTO.addLoyaltyPoints(cashback);
}
String loyaltyMatchInsuranceId = getLoyaltyMatchInsuranceIdBasedOnTransactionDTO(b2kTransactionDTO);
if (loyaltyMatchInsuranceIdAmountMap.containsKey(loyaltyMatchInsuranceId)) {
BigDecimal cashback = loyaltyMatchInsuranceIdAmountMap.get(loyaltyMatchInsuranceId);
b2kTransactionDTO.addLoyaltyPoints(cashback);
}
});
是否有可能甚至futher拉姆达nize呢?
谢谢
你为什么要把它放入lambda? Labda的启动/内存密集程度稍慢,并且不会增加代码的可读性。或者你是否需要平行主义来加速处理(这只会与大数据集相关) – Tschallacka
您可以将它转换为_two_独立的'foreach',并添加'map'和'filter'以更加“lambda-nize”。 (如...'map.(...)。filter(...)。map(...)。forEach(...))' –
另外,你的变量名称太长了......考虑将这些地图放入一个LoyaltyManager对象中,该对象处理匹配id的逻辑和返回的返现。 – Tschallacka