Stream Collectors Used In Conjunction of groupingBy

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)));
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章