Несколько предикатов для группировки коллекции в hashmap - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть список объектов, как показано ниже -

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 голосов
/ 05 декабря 2018

Вы можете сначала объявить перечисление как это, чтобы представить 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()));
...