Domain
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}
}
Enum
public enum CaloriesType {
FAT, DIET;
}
Initial Data
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) );
Total Calories By Type
void totalCaloriesByType(){
Map<Dish.Type, Integer> totalCaloriesByType = menu.stream()
.collect(groupingBy(Dish::getType,
summingInt(Dish::getCalories)));
}
Calories Levels By Type
void caloriesLevelsByType(){
Map<Dish.Type, Set<Enum>> caloriesLevelsByType = menu.stream().collect(groupingBy(Dish::getType
, mapping(dish -> {
if(dish.getCalories() < 400) return CaloriesType.DIET;
else return CaloriesType.FAT;
}, toSet()))
);
}
partitioning
//partitioning
void partitioningMenu(){
Map<Boolean, List<Dish>> partitioningMenu =
menu.stream()
.collect(partitioningBy(Dish::isVegetarian));
}
Advantage of Partitioning
void vegetarianDishesByType(){
Map<Boolean, Map<Dish.Type, List<Dish>>> map = menu.stream()
.collect(partitioningBy(Dish::isVegetarian, groupingBy(Dish::getType)));
}