Лямбды – (шпаргалка по Хорстманну)

  java.util.function, java8, JavaCore, шпаргалка

Источник – К.Хорстманн, Java 8, для самых нетерпеливых

0) лямбды, как и некоторые анонимные внутренние классы – замыкания(closure)
1) Выигрышная стратегия состоит в том, чтобы сочетать объектно-ориентированное программирование с функциональным
2) Термин лямбды ввел логик Алонсо Черч, для обозначения нерешаемых функций
3) Лямбда выражение – кодовый блок, который может быть передан для последующего выполнения один или несколько раз
4) Лямбда выражение представляет из себя кодовый блок, наряду с указанием любых переменных, которые могут быть переданы коду
6) Если в коде выполняется вычисление, не вписывающееся ни в одно выражение, можно написать его так, как пишется тело метода заключенного в круглые скобки

7) Если у лямбда-выражения отсутствуют параметры, то круглые скобки все равно указываются

8) Если типы параметров могут быть выведены автоматически, их можно опустить

9) Если у метода имеется единственный параметр выводимого типа, то можно опустить круглые скобки

10) Также можно добавлять как в методах final и аннотации

11)Тип результата лямбды не нужно указывать(но! лямбда обязана возвращать какое-то значение)
12) Лямбда-выражения обратно совместимы с функциональными интерфейсами
13) Функциональный интерфейс – интерфейс содержащий один и только один метод(кроме переопределенных от Object, дефолтных(default) и статических)
14) Любой функциональный интерфейс можно пометить аннотацией @FunctionalInterface (чтобы подключить проверку компилятора), но необязательно
15) наиболее популярные примеры функциональных интерфейсов – Runnable, Comparator, EventHandler (Thread.run, Arrays.sort,…)
16) Преобразование в функциональный интерфейс – единственное, что можно сделать с лямбда выражением
17) В пакете java.util.function есть множество функциональных интерфейсов(например BitFunction)
18) Если в теле лямбды может быть выброшено unchecked exception , нужно объявить это исключение(throws) в абстрактном методе интерфейса
либо, если оно не объявлено, необходимо обработать исключение в теле лямбды
19) ссылки на метод, как и лямбды, всегда преобразуются в функциональные интерфейсы
ссылки на метод, синтаксис

объект::метод экземпляра
класс::статический метод
класс::метод экземпляра

То есть данные записи эквивалентны:

Еще примеры:

Еще пример:

можно также использовать this и super
this::метод
super::метод

внешнийКласс.this.метод
внешнийКласс.super.метод

20) ссылки на конструкторы
SomeClass::new
можно также!!! использовать ссылки на конструкторы с типами массивов

это будет равнозначно

21) область действия переменных
лямбда выражения не могут изменять локальные переменные

22) Лямбда выражение состоит из трех составляющих

кодовый блок
параметры
значения свободных переменных

(свободная переменная – не являющаяся параметром и не определенная в коде лямбда выражения, локальные переменные метода в котором есть лямбда часто и являются классическим примером свободных переменных, то есть они как бы свободны от нашей лямбды, им на нее … делают что хотят)

в лямбдах можно обращаться только к тем переменным, значение которых не изменяются, нельзя изменять зафиксированные переменные(нельзя также их заново инициализировать) – это не потокобезопасно; можно модифицировать общий объект(но это не потокобезопасно тоже)
модифицировать нельзя только локальные переменные, – статические и экземпляра – можно

effective final переменная – переменная которой не присваивается новое значение после ее инициализации (можно сказать – почти константа, только для того что происходит в лямбде)
такой термин был введен для обозначения переменных которые не следует изменять дабы не поиметь проблем с потокобезопасностью

23) лямбды имеют такую же область действия как и вложенный блок, и соответственно затенение и конфликты имен также имеют место и также решаются.
Нельзя объявлять параметр и локальную переменную в лямбде, если локальная с таким именем уже существует
24) this в лямбдах ссылается не на внешний объект, а на функциональный интерфейс

Полезно знать:
а) Лямбды могут быть намного медленнее чем анонимные внутренние классы. Чем больше блок кода лямбды, тем больше может быть разрыв в производительности
б) В методе Integer.compare() не стоит в качестве возвращаемого значения выводить разность(так как может быть переполнено, – могут попасться крупные операнды)

Дефолтные методы
Методы интерфейсов с конкретной реализацией называются дефолтными методами (дефолтные методы интерфейсов “отнимают хлеб” у абстрактных классов)
Конфликты
1) побеждает суперкласс, дефолтный метод интерфейса игнорируется
2) если конфликтуют между собой интерфейсы за реализацию метода, то нужно переопределить метод в классе

Нельзя создать дефолтный метод для переопределения Object

Статические методы
в интерфейсах можно создавать статические методы

LEAVE A COMMENT