Встроенные функциональные интерфейсы
[https://t.me/source_coding]Для тех кто забыл ->
Функциональный интерфейс - это интерфейс, который содержит только 1 абстрактный метод (не реализованный). Основное назначение – использование в лямбда-выражениях и в ссылках на методы.
Predicate<T> Действительно ли?🤔
Predicate<T> проверяет соблюдение некоторого условия. Если оно соблюдается, то возвращается значение true. В качестве параметра лямбда-выражение принимает объект типа T:
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
}
Без примеров не обойдемся:
Predicate<String> predicate = x->x.equals("Alex");
boolean isAlex = predicate.test("Alex");
System.out.println(isAlex);

Consumer<T> Сейчас кое-кем воспользуемся😏
Consumer<T> выполняет некоторое действие над объектом типа T, при этом ничего не возвращая:
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}
Ex:
Consumer<Integer> consumer = x-> System.out.println(x*5); consumer.accept(10);

Function<T, R> - А не превратить ли кого-то в банан🍌?
Function принимает объект типа T, и возвращает объект типа R:
@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
}
Ex:
public class Main {
public static void main(String[] args) {
List<Student> studentList = new ArrayList<>();
studentList.add(new Student(4.5));
studentList.add(new Student(4.1));
studentList.add(new Student(5));
studentList.add(new Student(3.3));
studentList.add(new Student(2));
studentList.add(new Student(3.8));
printAvgGrade(studentList, x->x.getAvgGrade());
}
public static void printAvgGrade(List<Student> studentList, Function<Student, Double> function) {
for (Student student:studentList) {
System.out.println(function.apply(student));
}
}
}

Supplier<T> - Вот, возьмите, нет, вы что, ничего взамен не надо, благодарности излишни. Всего вам хорошего!
Supplier<T> не принимает никаких аргументов, но возвращает объект типа T:
public interface Supplier<T> {
T get();
}
Ex:
public interface Supplier<T> {
T get();
}
Supplier<Double> getMoney = () -> {
System.out.print("Укажите сумму, которую хотите вывести со счета: ");
double value = new Scanner(System.in).nextDouble();
System.out.println("Вы успешно сняли " + value + " долларов!");
return value;
};
getMoney.get();

UnaryOperator<T> - Пора бы уже улучшить мои оценки..
UnaryOperator<T> принимает в качестве параметра объект типа T, выполняет над ними операции и возвращает результат операций в виде объекта типа T:
public interface UnaryOperator<T> {
T apply(T t);
}
Ex:
UnaryOperator<Double> pointImprovement = x->x+=2;
double point = 3;
point = pointImprovement.apply(point);
System.out.println("Новая оценка: " + point);

BinaryOperator<T> - Капитан! Что дальше делать с этими двумя?
BinaryOperator<T> принимает в качестве параметра два объекта типа T, выполняет над ними бинарную операцию и возвращает ее результат также в виде объекта типа T:
public interface BinaryOperator<T> {
T apply(T t1, T t2);
}
Ex:
BinaryOperator<Double> operation = (x,y)->(x+y);
double sum = operation.apply(54.0, 100.0);
operation = (x,y)->(x*y);
double product = operation.apply(2.0, 50.0);
System.out.println("Sum: " + sum);
System.out.println("Product: " + product);

На этом все. Спасибо за прочтение.