Domain Object
public class Dish {
public Dish(String name, boolean vegetarian, int calories, Type type) {
this.name = name;
this.vegetarian = vegetarian;
this.calories = calories;
this.type = type;
}
public String getName() {
return name;
}
public int getCalories() {
return calories;
}
public boolean isVegetarian() {
return vegetarian;
}
public Type getType() {
return type;
}
private final String name;
private final boolean vegetarian;
private final int calories;
private final Type type;
public enum Type {MEAT, FISH, OTHER}
}
Initial Data
private static List<Dish> menu = Arrays.asList(
new Dish("pork", false, 800, Dish.Type.MEAT)
, new Dish("beef", false, 700, Dish.Type.MEAT)
, new Dish("chicken", false, 400, Dish.Type.MEAT)
, new Dish("french fries", true, 530, Dish.Type.OTHER)
, new Dish("rice", true, 350, Dish.Type.OTHER)
, new Dish("season fruit", true, 120, Dish.Type.OTHER)
, new Dish("pizza", true, 550, Dish.Type.OTHER)
, new Dish("prawns", false, 300, Dish.Type.FISH)
, new Dish("prawns", false, 300, Dish.Type.FISH)
, new Dish("salmon", false, 450, Dish.Type.FISH) );
Collecting Data In Subgroups
Counting In Subgroups
void subGroup(){
Map<Dish.Type, Long> map
= menu.stream().collect(groupingBy(Dish::getType,
counting()));
}
Max in Subgroups
void groupThenMax(){
Map<Dish.Type, Optional<Dish>> map
= menu.stream().collect(groupingBy(Dish::getType
, maxBy(Comparator.comparingInt(Dish::getCalories))));
}
Adapting the Collector Result to a Different Type
void groupMaxThenChangeResult(){
Map<Dish.Type, Dish> map = menu.stream().collect(groupingBy(Dish::getType,
collectingAndThen(maxBy(Comparator.comparingInt(Dish::getCalories)),
Optional::get)
));
}