首页 > 解决方案 > 如何使用前一个对象计算值转换地图对象

问题描述

我有这样的课

class Transaction{
    long id;
    String type;
    long quantity;
    double amount;
}

我想把它转换成如下

class TransactionDTO{
    long id;
    String type;
    long quantity;
    double amount;
    double total;
}

假设输入如下

Transaction( id=1, type=buy, quantity=5, amount=5)
Transaction( id=1, type=buy, quantity=2, amount=3)
Transaction( id=1, type=buy, quantity=3, amount=6)

应该输出如下(quantity*amount adds when buy subtract when sell with previous amount)

Transaction( id=1, type=buy, quantity=5, amount=5, total=25)
Transaction( id=1, type=sell, quantity=2, amount=3, total=19)
Transaction( id=1, type=buy, quantity=3, amount=6, total=37)

我可以使用 for 循环轻松完成此操作。但我想知道这是否可以用lambda.

特别希望将先前计算的总数与基于 的下一个元素一起使用Transaction type

那么这可以做到吗?如果是,那怎么办?

标签: javajava-8java-stream

解决方案


你可以这样做:

public List<TransactionDTO> getTransaction() {
    double[] temporaryTotal = new double[1];
    List<Transaction> transactionList = Arrays.asList(
            new Transaction(1, "buy", 5, 5),
            new Transaction(1, "sell", 2, 3),
            new Transaction(1, "buy", 3, 6)
    );

    return transactionList.stream()
            .map(
                    transaction -> new TransactionDTO(
                            transaction.getId(),
                            transaction.getType(),
                            transaction.quantity,
                            transaction.getAmount(),
                            calculate(transaction, temporaryTotal[0])
                    )
            )
            .peek(transaction -> temporaryTotal[0] = transaction.getTotal())
            .collect(Collectors.toList());
}

private double calculate(final Transaction transaction, final double total){
    if (transaction.getType().equals("buy")){
        return total + (transaction.getQuantity() * transaction.getAmount());
    }

    return total - (transaction.getQuantity() * transaction.getAmount());
}

由于变量total 不是最终的或有效的最终我们可以使用带有一个名为的元素的数组temporaryTotal

输出是:

[TransactionDTO(id=1, type=buy, quantity=5, amount=5.0, total=25.0),
 TransactionDTO(id=1, type=sell, quantity=2, amount=3.0, total=19.0),
 TransactionDTO(id=1, type=buy, quantity=3, amount=6.0, total=37.0)]

推荐阅读