Как сгруппировать по карте и изменить тип ключа - PullRequest
4 голосов
/ 21 апреля 2019

У меня есть код, который должен сгруппировать список объектов транзакции по 2 категориям;

public class Transaction {
    public String type;
    public Integer amount;
}

Следующая функция разбила список на 2 категории, проверив условие.Выходная карта операции потока - Map<Boolean, List<Transaction>>, но я хотел бы использовать строку в качестве ключа.Поэтому я преобразовал их вручную.

public static Map<String, List<Transaction>> partitionTransactionArray(List<Transaction> t1) {
    Map<Boolean, List<Transaction>> result = list.stream().collect(Collectors.groupingBy(e -> ((e.type.equals("BUY") || e.type.equals("SELL")) && e.amount < 1000)));

    // I think this is not necessary
    Map<String, List<Transaction>> result1 = new HashMap<>();
    result1.put("APPROVED", result.get(true));
    result1.put("PENDING", result.get(false));

    return result1;
}

Однако я думаю, что должен быть умный способ, позволяющий мне выполнять эту операцию в одной операции потока.

Может ли кто-нибудь помочь?

РЕДАКТИРОВАТЬ:

Что если вместо возврата Map<String, List<Transactions>> я хочу вернуть Map<String, List<Integer>>, где содержится списоктолько сумма сделки.

Как я могу сделать это в однопотоковой операции?

Ответы [ 2 ]

1 голос
/ 21 апреля 2019

Заменить

((e.type.equals("BUY") || e.type.equals("SELL")) && e.amount < 1000)

на

((e.type.equals("BUY") || e.type.equals("SELL")) && e.amount < 1000) ? "APPROVED" : "PENDING"

Возможно, вы должны использовать enum вместо констант магической строки.

0 голосов
/ 21 апреля 2019

Вы можете использовать нисходящий поток до partitioningBy вместо groupingBy, используя Collectors.mapping как:

Map<Boolean, List<Integer>> result = list.stream()
        .collect(Collectors.partitioningBy(e ->
                        ((e.type.equals("BUY") || e.type.equals("SELL")) && e.amount < 1000),
                Collectors.mapping(Transaction::getAmount, Collectors.toList())));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...