【问题标题】:calculate property based on another field using stream使用流计算基于另一个字段的属性
【发布时间】:2018-12-10 17:39:38
【问题描述】:

我有下面想要转换为流的代码,在 parallelStream 或流中编写如此复杂的逻辑可能没有意义,但仍然想了解我们如何使用 lambda 表达式编写它。

for(PositionModel position :positionList)
    {           
        StringBuffer line = new StringBuffer();
        line.append(position.getInstrument());
        line.append(CSV_SEPARATOR);
        line.append(position.getAccount());
        line.append(CSV_SEPARATOR);
        line.append(position.getAccountType());
        line.append(CSV_SEPARATOR);

        List<TransactionModel> tranList = transactionMap.get(position.getInstrument());
        int delta = 0;
        if(tranList != null )
        {

            tranList.parallelStream().collect(Collectors.gr)
            for(TransactionModel tran: tranList)
            {
                if(PositionCalcContant.BUY_INDICATOR.equals(tran.getTransactionType()))
                {
                    if(PositionCalcContant.EXTERNAL.equals(position.getAccountType()))
                    {
                        delta += tran.getTransactionQuantity();
                    }
                    else
                    {
                        delta -= tran.getTransactionQuantity();
                    }                       
                }
                if(PositionCalcContant.SELL_INDICATOR.equals(tran.getTransactionType()))
                {
                    if(PositionCalcContant.EXTERNAL.equals(position.getAccountType()))
                    {
                        delta -= tran.getTransactionQuantity();
                    }
                    else
                    {
                        delta += tran.getTransactionQuantity();
                    }

                }
            }
        }
        line.append(position.getQuantity()+delta);
        line.append(CSV_SEPARATOR);
        line.append(delta);
        bw.write(line.toString());
        bw.newLine();

        position.setDelta(delta);

        if(Math.abs(delta) > maxChange)
        {
            maxChange = delta;
            maxChangeInstrument = position;
            maxChangeInstrument.setDelta(delta);
        }
        if(Math.abs(delta) < minChange)
        {
            minChange = delta;
            minChangeInstrument = position;
            minChangeInstrument.setDelta(delta);
        }
    }

这里有 2 个循环我想将两者都转换为 lambda 或将内部循环转换为 lambda

【问题讨论】:

  • 我认为这不适合流,因为会有副作用和其他事情发生。
  • 至少是transactionList的内部循环?

标签: java lambda java-8 java-stream


【解决方案1】:

我正在尝试一些东西并想出了下面,这是否比原始代码更差/更好。

delta = tranList.parallelStream().collect
                    (Collectors.summingInt(model -> getDelta(model, position.getAccountType()))).intValue();

private int getDelta(TransactionModel tran, String accountType) {

    int delta = 0;
    if(PositionCalcContant.BUY_INDICATOR.equals(tran.getTransactionType()))
    {
        if(PositionCalcContant.EXTERNAL.equals(accountType))
        {
            delta += tran.getTransactionQuantity();
        }
        else
        {
            delta -= tran.getTransactionQuantity();
        }                       
    }
    if(PositionCalcContant.SELL_INDICATOR.equals(tran.getTransactionType()))
    {
        if(PositionCalcContant.EXTERNAL.equals(accountType))
        {
            delta -= tran.getTransactionQuantity();
        }
        else
        {
            delta += tran.getTransactionQuantity();
        }
    }
    return delta;
}

这仅适用于我们正在计算增量的内部循环,即使我同意它也会太复杂并且可能不值得。

【讨论】:

  • tran.getTransactionType() 是否有其他可能的返回值?这些嵌套的 if 语句看起来非常多余,因为无论哪种情况,您最终都会执行 delta ±= tran.getTransactionQuantity()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-17
  • 1970-01-01
  • 1970-01-01
  • 2010-12-23
  • 2021-07-15
  • 1970-01-01
  • 2020-02-05
相关资源
最近更新 更多