рассчитать свойство на основе другого поля, используя поток - PullRequest
0 голосов
/ 10 декабря 2018

Ниже приведен код, который я хочу преобразовать в поток, возможно, не имеет смысла писать такую ​​сложную логику в parallelStream или потоке, но все же хотелось понять, как бы мы написали это с помощью лямбда-выражения.

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 цикла, которые я хочу преобразовать в лямбду или перевести внутренний цикл в лямбду

1 Ответ

0 голосов
/ 10 декабря 2018

Я пытался что-то и придумал ниже, это в любом случае хуже / лучше, чем оригинальный код.

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

Также это только для внутреннего цикла, где мы вычисляем дельту, дляВ целом, даже я согласен, что это будет слишком сложно и, возможно, не стоит этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...