使用流根据条件过滤最大值列表

时间:2018-12-02 10:00:44

标签: java-8

我有一个如下所示的带有自定义对象的列表,我需要根据客户ID和betOfferId过滤掉最大赌注值,但是客户ID不应重复(重复),基本上对于我想要获取的特定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 :(得分:1)

这就是我要做的事情:

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的对象。
  • 客户ID不会像您提到的那样重复。
  • 明智地获取最高的客户价值。
  • ,并限制了20个客户的特定权益。

流管道的细分:

至此,我们现在根据客户ID和客户的最高赌注值有不同的对象。

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是包含customerIdstake等的类。

Ideone