Открыть Электронные книги
Категории
Открыть Аудиокниги
Категории
Открыть Журналы
Категории
Открыть Документы
Категории
Пример 1
Например:
(пар1, пар2...) -> { тело }
() -> 42
() -> { return 3.1415 };
Cтруктура lambda-выражений:
Lambda-выражения могут иметь от 0 и более входных
параметров.
Тип параметров можно указывать явно либо может быть
получен из контекста. Например (int a) можно записать и так
(a)
Параметры заключаются в круглые скобки и разделяются
запятыми. Например (a, b) или (int a, int b) или (String a, int
b, float c)
Если параметров нет, то нужно использовать пустые круглые
скобки. Например () -> 42
Когда параметр один, если тип не указывается явно, скобки
можно опустить. Пример: a -> return a*a
Тело Lambda-выражения может содержать от 0 и более
выражений.
Если тело состоит из одного оператора, его можно не
заключать в фигурные скобки, а возвращаемое значение
можно указывать без ключевого слова return.
В противном случае фигурные скобки обязательны (блок
кода), а в конце надо указывать возвращаемое значение с
использованием ключевого слова return (в противном случае
типом возвращаемого значения будет void).
Терминальные лямбды – не возвращают никакого значения.
Пример:
interface Printable{
void print(String s);
}
Predicate<T>
Consumer<T>
Function<T,R>
Supplier<T>
UnaryOperator<T>/BinaryOperator<T>
Функциональный интерфейс в Java – это интерфейс, который содержит
только 1 абстрактный метод, а так же может содержать default и static
методы.
Основное назначение – использование в лямбда-выражениях и method
reference.
Рекомендуется добавлять @FunctionalInterface. Это не обязательно, но
при наличии данной аннотации код не скомпилируется, если будет
больше или меньше, чем 1 абстрактный метод (т.е. позволит
использовать интерфейс в лямбда-выражениях, не остерегаясь того, что
кто-то добавит в интерфейс новый абстрактный метод и он перестанет
быть функциональным).
В Java есть встроенные функциональные интерфейсы, размещенные в
пакете java.util.function
Если существующий у вас метод уже делает все, что вам нужно, то
вы можете воспользоваться механизмом method reference
(ссылка на метод) для непосредственной передачи этого метода.
Работают ссылки на методы при условии, что параметры
вызываемого метода и параметры в лямбде совпадают.
Для использования необходимо написать оператор ::
Еще примеры:
System.out::println эквивалентно x -> System.out.println(x)
Math::pow эквивалентно (x, y) -> Math.pow(x, y)
String::compareToIgnoreCase (x, y) -> x.compareToIgnoreCase(y)
Помимо методов, так же можно передавать ссылки на
конструкторы.
Пример 5
class User {
String name, surname;
и интерфейс UserFactory
interface UserFactory {
User create(String name, String surname);
}
Пример 6
interface Expression{
boolean isEqual(int n);
}
Пример 8
interface Operation{
int calculate();
}
public class LambdaApp {
Operation op = ()->{
x=30;
return x+y;
};
System.out.println(op.calculate()); // 50
System.out.println(x); // 30 - значение x изменилось
}
}
Переменные x и y объявлены на уровне класса, и в лямбда-
выражении мы их может получить и даже изменить. Так, в
данном случае после выполнения выражения изменяется
значение переменной x.
Пример 9
interface Operation{
int calculate();
}