в классе Collectors есть перегруженный фабричный метод groupingBy, принимающий второй аргумент типа Collector наряду с обычной функцией классификации. Таким образом, появляется возможность перенести предикат фильтрации внутрь этого второго коллектора, вот так:
Map> caloricDishesByType =
menu.stream()
.collect(groupingBy(Dish::getType,
filtering(dish -> dish.getCalories() > 500, toList())));
filtering — еще один статический фабричный метод класса Collectors, принимающий в качестве параметров предикат для фильтрации элементов в каждой из групп и еще один коллектор для перегруппировки профильтрованных элементов.