/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
import java.util.function.*;
import java.util.stream.*;
import static java.util.stream.Collectors.*;
import java.util.List;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
{
List<T> source = new ArrayList<>();
source.add(new T(12345, 9000, 999));
source.add(new T(12345, 8000, 999));
source.add(new T(1234, 4500, 888));
source.add(new T(1234, 8500, 888));
source.add(new T(1234, 7500, 888));
source.add(new T(1234, 7500, 999));
source.add(new T(1234, 7500, 999));
source.add(new T(1234, 8500, 999));
int offerId = 999;
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());
}
}
class T {
public T(int customerId, int stake, int offerId) {
this.customerId = customerId;
this.stake = stake;
this.offerId = offerId;
}
@Override
return "T{" +
"customerId=" + customerId +
", stake=" + stake +
", offerId=" + offerId +
'}';
}
int customerId;
public int getCustomerId() {
return customerId;
}
public void setCustomerId(int customerId) {
this.customerId = customerId;
}
public int getStake() {
return stake;
}
public void setStake(int stake) {
this.stake = stake;
}
public int getOfferId() {
return offerId;
}
public void setOfferId(int offerId) {
this.offerId = offerId;
}
int stake;
int offerId;
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CmltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uKjsKaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uKjsKaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMuKjsKaW1wb3J0IGphdmEudXRpbC5MaXN0OwovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgoJewoJICBMaXN0PFQ+IHNvdXJjZSA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICBzb3VyY2UuYWRkKG5ldyBUKDEyMzQ1LCA5MDAwLCA5OTkpKTsKICAgICAgICBzb3VyY2UuYWRkKG5ldyBUKDEyMzQ1LCA4MDAwLCA5OTkpKTsKICAgICAgICBzb3VyY2UuYWRkKG5ldyBUKDEyMzQsIDQ1MDAsIDg4OCkpOwogICAgICAgIHNvdXJjZS5hZGQobmV3IFQoMTIzNCwgODUwMCwgODg4KSk7CiAgICAgICAgc291cmNlLmFkZChuZXcgVCgxMjM0LCA3NTAwLCA4ODgpKTsKICAgICAgICBzb3VyY2UuYWRkKG5ldyBUKDEyMzQsIDc1MDAsIDk5OSkpOwogICAgICAgIHNvdXJjZS5hZGQobmV3IFQoMTIzNCwgNzUwMCwgOTk5KSk7CiAgICAgICAgc291cmNlLmFkZChuZXcgVCgxMjM0LCA4NTAwLCA5OTkpKTsKICAgICAgICBpbnQgb2ZmZXJJZCA9IDk5OTsKICAgICAgICBMaXN0PFQ+IHJlc3VsdCA9IHNvdXJjZS5zdHJlYW0oKQogICAgICAgICAgICAuZmlsdGVyKHggLT4geC5nZXRPZmZlcklkKCkgPT0gb2ZmZXJJZCkKICAgICAgICAgICAgLmNvbGxlY3QodG9NYXAoVDo6Z2V0Q3VzdG9tZXJJZCwKICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbi5pZGVudGl0eSgpLAogICAgICAgICAgICAgICAgICAgIEJpbmFyeU9wZXJhdG9yLm1heEJ5KENvbXBhcmF0b3IuY29tcGFyaW5nSW50KFQ6OmdldFN0YWtlKSkpKQogICAgICAgICAgICAudmFsdWVzKCkKICAgICAgICAgICAgLnN0cmVhbSgpCiAgICAgICAgICAgIC5jb2xsZWN0KGdyb3VwaW5nQnkoVDo6Z2V0U3Rha2UpKQogICAgICAgICAgICAudmFsdWVzKCkKICAgICAgICAgICAgLnN0cmVhbSgpCiAgICAgICAgICAgIC5mbGF0TWFwKHggLT4geC5zdHJlYW0oKS5saW1pdCgyMCkpCiAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOwoKICAgICAKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVzdWx0KTsKCgl9Cn0KCmNsYXNzIFQgewogICAgcHVibGljIFQoaW50IGN1c3RvbWVySWQsIGludCBzdGFrZSwgaW50IG9mZmVySWQpIHsKICAgICAgICB0aGlzLmN1c3RvbWVySWQgPSBjdXN0b21lcklkOwogICAgICAgIHRoaXMuc3Rha2UgPSBzdGFrZTsKICAgICAgICB0aGlzLm9mZmVySWQgPSBvZmZlcklkOwogICAgfQoKICAgIEBPdmVycmlkZQogICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICByZXR1cm4gIlR7IiArCiAgICAgICAgICAgICAgICAiY3VzdG9tZXJJZD0iICsgY3VzdG9tZXJJZCArCiAgICAgICAgICAgICAgICAiLCBzdGFrZT0iICsgc3Rha2UgKwogICAgICAgICAgICAgICAgIiwgb2ZmZXJJZD0iICsgb2ZmZXJJZCArCiAgICAgICAgICAgICAgICAnfSc7CiAgICB9CgogICAgaW50IGN1c3RvbWVySWQ7CgogICAgcHVibGljIGludCBnZXRDdXN0b21lcklkKCkgewogICAgICAgIHJldHVybiBjdXN0b21lcklkOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbWVySWQoaW50IGN1c3RvbWVySWQpIHsKICAgICAgICB0aGlzLmN1c3RvbWVySWQgPSBjdXN0b21lcklkOwogICAgfQoKICAgIHB1YmxpYyBpbnQgZ2V0U3Rha2UoKSB7CiAgICAgICAgcmV0dXJuIHN0YWtlOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHNldFN0YWtlKGludCBzdGFrZSkgewogICAgICAgIHRoaXMuc3Rha2UgPSBzdGFrZTsKICAgIH0KCiAgICBwdWJsaWMgaW50IGdldE9mZmVySWQoKSB7CiAgICAgICAgcmV0dXJuIG9mZmVySWQ7CiAgICB9CgogICAgcHVibGljIHZvaWQgc2V0T2ZmZXJJZChpbnQgb2ZmZXJJZCkgewogICAgICAgIHRoaXMub2ZmZXJJZCA9IG9mZmVySWQ7CiAgICB9CgogICAgaW50IHN0YWtlOwogICAgaW50IG9mZmVySWQ7Cn0=