多个谓词可将集合分类为哈希图

时间:2018-12-05 03:42:55

标签: java-8 java-stream predicate

我有一个对象列表,如下所示-

List<Transaction>

交易对象的外观

Transaction {

    String Status;
}

Status <A,B,C,D,E,F,G...>

If Status in (A,B,C)->Success
If Status in (D,E,F)->Failure
If Status in (G,H...)->Pending

定义了用于识别每个状态交易的个人谓词。

预期输出将是一个哈希图,其中将成功/失败/拒绝文本作为键,并将这些状态的总计数作为值

HashMap<String, Integer> ->
    {
        "Success": 1,
        "Failure":2,
        "Pending":2
    }

我无法在单次执行中继续执行此操作。现在,我分别获得计数。有人可以协助您吗?

1 个答案:

答案 0 :(得分:2)

您可以首先声明一个这样的枚举,以表示您感兴趣的3个状态。

public enum TxStatus {
    Success, Failure, Pending;
}

然后在Transaction中编写一个方法,将String文字值转换为您期望的真实状态值。这是一个这样的实现。

public class Transaction {
    private final String status;
    private Pattern SUCCESS_PATTERN = Pattern.compile("[ABC]");
    private Pattern FAILURE_PATTERN = Pattern.compile("[DEF]");
    private Pattern PENDING_PATTERN = Pattern.compile("[GHI]");

    public Transaction(String status) {
        super();
        this.status = status;
    }

    public String getStatus() {
        return status;
    }

    public TxStatus interpretStatus() {
        if (SUCCESS_PATTERN.matcher(status).matches()) {
            return TxStatus.Success;
        }
        if (FAILURE_PATTERN.matcher(status).matches()) {
            return TxStatus.Failure;
        }
        if (PENDING_PATTERN.matcher(status).matches()) {
            return TxStatus.Pending;
        }
        throw new IllegalArgumentException("Invalid status value.");
    }
}

最后,您的客户代码应如下所示,

Map<String, Long> txStatusToCountMap = txs.stream()
    .collect(Collectors.groupingBy(tx -> tx.interpretStatus().toString(), 
        Collectors.counting()));