Reputation:
I have List of Products and want to find count of products in specific cost range like, if productList is having 10 products with cost between 1-10, 50 between 11-100 and 100 between 101-1000, then it should return a map as follow,
"1-10": 10 "11-100": 50 "101:1000": 100
class Product {
long id;
long cost;
String name;
//getters setters
}
I tried many things but did not work, List productList = getProducts();
productList.stream().collect(Collectors.toMap(//logic to get map));
Highly appreciate any help.
Upvotes: 2
Views: 475
Reputation: 7165
You can create a Function
for range and use Collectors.groupingBy
as below,
Map<String, Long> countByCost = productList.stream()
.collect(Collectors.groupingBy(costRange, TreeMap::new, Collectors.counting()));
Function<Product, String> costRange = ele -> {
if(ele.cost >= 1 && ele.cost < 11)
return "1-10";
if(ele.cost >= 11 && ele.cost < 101)
return "11-100";
if(ele.cost >= 101 && ele.cost < 1001)
return "101-1000";
return "others";
};
UPDATE: More elegant Function for cost range as suggested by Holger,
Function<Product, String> costRange = ele -> {
if(ele.cost < 1) return "others";
long i = ele.cost == 1? 1: (long)Math.pow(10, Math.floor(Math.log10(ele.cost-1)));
return (i|1)+"-"+(i*10); };
Upvotes: 3