带有两个if语句的Java 8 Lambda Stream forEach

时间:2016-11-11 12:55:16

标签: java lambda

我正在尝试将一些for循环重构为lambda表达式,其中大部分工作正常,但我正在努力处理包含两个if语句的for循环。

代码

source /path/to/script

我将此重构为以下代码:

        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);
            }
        }

是否有可能进一步发展这个?

由于

2 个答案:

答案 0 :(得分:0)

这不是您正在寻找的答案。

我想说,不要在这里使用lambda。

Lambda可以帮助您利用cpu的parralelism功能来加速处理大型数据集。

根据我的经验,使用较小数据集的lambda(< 10(0).000)不值得麻烦;

保持代码的可读性,可维护性和可插拔性。

学习制作处理目的的对象。不要把所有的东西都放在一个对象中,最后得到非常有价值的名称,这样就可以解决这个问题。

当出现长变量名时,它应该是一个信号,您可以将该代码重构为多个处理单一用途的对象。

如果您真的想使用lambda,请尝试以下方法: 为价值持有者和处理器分离对象以及单独任务的方法,在需要时更容易使用lambda,因为你可以简单地插入所需任务的方法并传递价值持有者对象以获得你想要的结果

所以,不是你正在寻找的答案,但这在评论中真的无法解释。

答案 1 :(得分:0)

我认为你也应该考虑重构你的代码,因为看起来匹配 matchInsurance 之间有很多重复。

private static void addLoyaltyPoints(Collection<B2KTransactionDTO> result, Map<String, BigDecimal> ids, Function<B2KTransactionDTO, String> extractId)
{
    result.stream()
          .filter(b -> ids.containsKey(extractId.apply(b)))
          .forEach(b -> b.addLoyaltyPoints(ids.get(extractId.apply(b))));
}

然后您发布的整个代码可能会变成:

addLoyaltyPoints(result, loyaltyMatchIdAmountMap, Use::getLoyaltyMatchIdBasedOnTransactionDTO);
addLoyaltyPoints(result, loyaltyMatchInsuranceIdAmountMap, Use::getLoyaltyMatchInsuranceIdBasedOnTransactionDTO);

编辑:addLoyaltyPoints的另一个版本(更简洁,更少表现力):

private static void addLoyaltyPoints(Collection<B2KTransactionDTO> result, Map<String, BigDecimal> ids, Function<B2KTransactionDTO, String> extractId)
{
    result.stream()
          .forEach(b -> b.addLoyaltyPoints(ids.getOrDefault(extractId.apply(b), new BigDecimal(0))));
}