我有一个如下所示的带有自定义对象的列表,我需要根据客户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
}
]
答案 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和客户的最高赌注值有不同的对象。
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
等的类。