有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用流基于另一个字段计算属性

我有下面的代码,我想把它们转换成流,在parallelStream或stream中编写这样复杂的逻辑可能没有意义,但我仍然想了解我们如何用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);
        }
    }

这里有两个循环,我想把它们都转换成lambda,或者把内部循环转换成lambda


共 (1) 个答案

  1. # 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;
    }
    

    此外,这只适用于我们正在计算delta的内部循环,就整体而言,即使我同意这太复杂,可能不值得