Использование потоков фильтрует список максимальных значений на основе условий - PullRequest
0 голосов
/ 02 декабря 2018

У меня есть список, подобный приведенному ниже, с пользовательским объектом, мне нужно отфильтровать максимальные значения ставки, основываясь на идентификаторе клиента и betOfferId, но идентификатор клиента не должен повторяться (дублироваться), в основном для конкретного betofferid, я хочу получитьсписок максимальных значений ставки для клиентов и ограничить его до 20 клиентов максимум для конкретной ставки.

Например, для приведенного ниже списка, если я дал betofferid как 999, мне нужно получить вот так, так как есть 2клиенты, это нормально.{"customerId": 12345, "betOfferId": 999, "пари": 9000} и {"customerId": 1234, "betOfferId": 999, "ставки": 8500}

ниже с учетом ставок

{"customerId": 1234, "betOfferId": 888, "кол": 4500}

{
    "customerId": 12345,
    "betOfferId": 999,
    "stake": 9000
},
{
    "customerId": 12345,
    "betOfferId": 999,
    "stake": 8000
},
{
    "customerId": 1234,
    "betOfferId": 888,
    "stake": 8500
},
{
    "customerId": 1234,
    "betOfferId": 888,
    "stake": 7500
},
{
    "customerId": 1234,
    "betOfferId": 999,
    "stake": 7500
},
{
    "customerId": 1234,
    "betOfferId": 999,
    "stake": 7500
},
{
    "customerId": 1234,
    "betOfferId": 999,
    "stake": 8500
}

]

1 Ответ

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

Вот как бы я поступил так:

List<T> result = source.stream()
            .filter(x -> x.getOfferId() == offerId)
            .collect(toMap(T::getCustomerId,
                    Function.identity(),
                    BinaryOperator.maxBy(Comparator.comparingInt(T::getStake))))
            .values()
            .stream()
            .collect(groupingBy(T::getStake))
            .values()
            .stream()
            .flatMap(x -> x.stream().limit(20))
            .collect(Collectors.toList());
  • сохраняет только те объекты, где их предложение, если оно соответствует предоставленным offerId.
  • , идентификаторы клиентов неповторите, как вы упомянули.
  • получает самые высокие значения ставки для клиента.
  • и ограничено 20 клиентами для конкретной ставки .

разбивка потокового конвейера:

на данный момент у нас теперь есть различные объекты по идентификатору клиента и самым высоким значениям ставки для клиента.

source.stream()
            .filter(x -> x.getOfferId() == offerId)
            .collect(toMap(T::getCustomerId,
                    Function.identity(),
                    BinaryOperator.maxBy(Comparator.comparingInt(T::getStake))))

теперь мы ограничиваем егоМаксимум для 20 клиентов для конкретной ставки.

.values()
.stream()
.collect(groupingBy(T::getStake))
.values()
.stream()
.flatMap(x -> x.stream().limit(20))
.collect(Collectors.toList());

Где T - класс, содержащий customerId, stake и т. д. *

Ideone

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