Почему я не могу использовать ссылку на метод и условие в качестве предиката в методе filtering()?
Разъясните, пожалуйста, одну вещь, которую я не понимаю. Сейчас читаю книгу Modern Java, и не очень понятен один пункт.
Map<Type, List<Dish>> dishesByType = menu.stream().collect(groupingBy(Dish::getType,
filtering(d->d.getCalories() > 500, toList())));
В данном коде в метод filtering я передаю условие, в виде лямбда выражения. Вопрос - почему я не могу передать туда вот такое условие - Dish::getCalories > 500?
@Data
public static class Dish {
private final String name;
private final boolean vegetarian;
private final int calories;
private final Type type;
public Dish(String name, boolean vegetarian, int calories, Type type) {
this.name = name;
this.vegetarian = vegetarian;
this.calories = calories;
this.type = type;
}
}
Ответы (1 шт):
Автор решения: Alex Rudenko
→ Ссылка
Потому что предикат по определению -- функция,возвращающая булевое значение и в данном контексте принимающая аргумент с типом Dish. Таким образом, в качестве ссылки на метод могли бы использоваться только:
- статический метод вида:
static boolean over500Calories(Dish dish):filtering(MyClass::over500Calories) - метод в классе
Dish:class Dish { public boolean over500() { return calories > 500;}}
При особом желании ссылку на метод можно было бы использовать
например при такой реализации over500Calories:
private static boolean over500Calories(Dish dish) {
return over(dish, Dish::getCalories, 500);
}
private static <T> boolean over(T obj, ToIntFunction<T> getter, int value) {
return getter.applyAsInt(obj) > value;
}